我们有一个派生自DependencyObject的对象,并实现了一些DependencyProperties。
基本上是这样的:
class Context : DependencyObject {
public static readonly DependencyProperty NameProperty =
DependencyProperty.Register ("Name", typeof (string), typeof (Context), new PropertyMetadata (""));
public string Name {
get {
return (string)this.GetValue (NameProperty);
}
set {
this.SetValue (NameProperty, value);
}
}
}
这是有效的,属性设置,可以绑定等。当我使用TwoWay绑定从WPF绑定到属性时出现问题。 TwoWay部分从未实际发生过,WPF从不调用此属性的集合。我已经设置了这样的绑定:
<TextBox Text="{Binding Path=Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
在这种情况下,键入文本框应立即更新Name属性,但不会。如果我将Name属性更改为常规POCO属性,它可以工作(尽管除非我实现INotifyPropertyChanged,否则TwoWay的另一面显然不会。)
我在这里做错了什么?这应该是一件非常简单的事情,但它让我头疼不已。
答案 0 :(得分:11)
这是预期的行为。 CLR属性只是底层DependencyProperty
的包装器。 WPF通常会直接调用GetValue
和SetValue
进行优化。如果您需要执行自定义逻辑,请使用DependencyProperty
。
答案 1 :(得分:2)
这个问题花了我一些时间后:
对于那些有同样问题的人,但是 - 像我一样 - 在上面的答案中没有看到解决方案:
为了支持DataContext的继承,自定义类(在本例中为Context)必须从 FrameworkElement 而不是 DependencyObject 派生。就是这样。
马克