将自定义类型属性绑定到自定义控件
本文关键字:自定义控件 绑定 属性 自定义 类型 | 更新日期: 2023-09-27 17:57:02
我正在尝试将自定义类型的属性绑定到用户控件(在我们的示例中,我们将其称为DataContextOne
)。此自定义类型由两个字符串组成。
然后,我有一个要将此自定义类型绑定到的用户控件。
奇怪的是,如果我放入我的控件 2 个字符串属性,然后尝试从我的自定义类型绑定每个字符串,它就会起作用。但是,当我在自定义控件中仅创建一个 DataContextOne
属性并尝试绑定到它时,没有任何反应(= 用户控件中的 null)。
这是我的代码
DataContextOne
public class DataContextOne : INotifyPropertyChanged
{
protected virtual void RaisePropertyChanged(string propertyName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
public event PropertyChangedEventHandler PropertyChanged;
private string _title;
public string Title
{
get { return _title; }
set
{
if (_title != value)
{
_title = value;
TitleModified = _title + " modified";
RaisePropertyChanged("Title");
}
}
}
private string _titlemodified;
public string TitleModified
{
get { return _titlemodified; }
set
{
if (_titlemodified != value)
{
_titlemodified = value;
RaisePropertyChanged("TitleModified");
}
}
}
}
有效的绑定
用户控件
public partial class MyUserControl : UserControl
{
public MyUserControl()
{
InitializeComponent();
(Content as FrameworkElement).DataContext = this;
}
public string Text
{
get { return (string)GetValue(TextProperty); }
set { SetValue(TextProperty, value); }
}
public static readonly DependencyProperty TextProperty = DependencyProperty.Register(
"Text",
typeof(string),
typeof(MyUserControl),
null);
public string TextModified
{
get { return (string)GetValue(TextModifiedProperty); }
set { SetValue(TextModifiedProperty, value); }
}
public static readonly DependencyProperty TextModifiedProperty = DependencyProperty.Register(
"TextModified",
typeof(string),
typeof(MyUserControl),
null);
}
主窗口
代码隐藏
public partial class MainWindow : Window
{
Random Rnd = new Random();
DataContextOne dtone = new DataContextOne();
public MainWindow()
{
InitializeComponent();
dtone.Title = Rnd.Next().ToString();
DataContext = dtone;
}
private void Button_Click(object sender, RoutedEventArgs e)
{
dtone.Title = Rnd.Next().ToString();
}
}
XAML:
<local:MyUserControl Grid.Row="1" Text="{Binding Title, UpdateSourceTrigger=PropertyChanged}" TextModified="{Binding TitleModified, UpdateSourceTrigger=PropertyChanged}"/>
绑定不起作用
用户控制
public partial class MyUserControl : UserControl
{
public MyUserControl()
{
InitializeComponent();
(Content as FrameworkElement).DataContext = this;
}
public DataContextOne dtone
{
get { return (DataContextOne)GetValue(dtoneProperty); }
set { SetValue(dtoneProperty, value); }
}
public static readonly DependencyProperty dtoneProperty = DependencyProperty.Register(
"dtone",
typeof(DataContextOne),
typeof(MyUserControl),
null);
}
主窗口
代码隐藏(注意我绑定了this
)
public partial class MainWindow : Window
{
Random Rnd = new Random();
DataContextOne dtone = new DataContextOne();
public MainWindow()
{
InitializeComponent();
dtone.Title = Rnd.Next().ToString();
DataContext = this;
}
private void Button_Click(object sender, RoutedEventArgs e)
{
dtone.Title = Rnd.Next().ToString();
}
}
XAML
<local:MyUserControl Grid.Row="1" dtone="{Binding dtone, UpdateSourceTrigger=PropertyChanged}" Margin="0,31,200,169"/>
我不明白缺少什么。对我来说,这只是一个封装第二个版本字符串的自定义类型,这是一回事,那么为什么它不起作用呢?
{Binding dtone}
试图绑定到DataContext
dtone
的属性,即MainWindow
。MainWindow
类中没有dtone
属性,只有一个私有字段,并且不能绑定到字段。
可能的解决方案:
- 使
dtone
成为属性 - 或将
DataContext = this
更改为DataContext = dtone
,{Binding dtone}
更改为{Binding}
更新
可能无关,但似乎没有理由在MyUserControl
拥有dtone
财产。为什么不简单
<local:MyUserControl Grid.Row="1" DataContext="{Binding dtone}" />
而不尝试在构造函数中手动设置DataContext
MyUserControl
?