如何在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
具有空的选定值。