如何在WPF中创建可绑定属性?

我有一个用户控件。 我想在我的用户控件中创建一个可绑定的属性。 我创建一个DependencyProperty如下:

public static readonly DependencyProperty DateProperty = DependencyProperty.Register("Date", typeof(DateTime), typeof(DaiesContainer), new UIPropertyMetadata(DateTime.Now)); public DateTime Date { get { return (DateTime)GetValue(DateProperty); } set { SetValue(DateProperty, value); } } 

然后我在我的XAML中使用它:

  

在我的ViewModel中,调用Date属性的get方法。 但在我的用户控件中,Date属性未设置为值。

您的依赖项属性实现缺少在PropertyChangedCallback值更改时调用的PropertyChangedCallback 。 回调被注册为静态方法,该方法将当前实例(其属性已更改)作为其第一个参数(类型为DependencyObject )传递。 您必须将其强制转换为类类型才能访问实例字段或方法,如下面的show所示。

 public static readonly DependencyProperty DateProperty = DependencyProperty.Register("Date", typeof(DateTime), typeof(DaiesContainer), new PropertyMetadata(DateTime.Now, DatePropertyChanged)); public DateTime Date { get { return (DateTime)GetValue(DateProperty); } set { SetValue(DateProperty, value); } } private void DatePropertyChanged(DateTime date) { //... } private static void DatePropertyChanged( DependencyObject d, DependencyPropertyChangedEventArgs e) { ((DaiesContainer)d).DatePropertyChanged((DateTime)e.NewValue); } 

另请注意,为类的所有实例仅设置一次依赖项属性的默认值。 因此,设置DateTime.Now值将为所有这些值生成相同的默认值,即静态DependencyProperty的注册时间。 我想使用更有意义的东西,也许DateTime.MinValue ,将是一个更好的选择。 由于MinValue已经是新创建的DateTime实例的默认值,您甚至可以省略属性元数据中的默认值:

 public static readonly DependencyProperty DateProperty = DependencyProperty.Register("Date", typeof(DateTime), typeof(DaiesContainer), new PropertyMetadata(DatePropertyChanged)); 

使你的绑定模式TwoWay

  

我认为您在XAML UserControl中有错误。

你应该通过ElementName绑定,例如:

      

在这种情况下,您绑定到DaiesContainer类的Date属性。

如果使用不带ElementName绑定:

  

UserControl DaiesContainer将尝试在此用户控件的容器的DataContext中查找属性Date ,如果找不到此属性,您将看到DatePicker具有空的选定值。