WPF中的自定义依赖属性和双向绑定

7
我们有一个从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);
        }
    }
}

这段代码本身是没有问题的,属性可以设置和绑定等。但是当我尝试从WPF进行双向绑定时,问题就出现了。双向绑定并没有真正地发生,WPF也没有调用此属性的set方法。我的绑定方式如下:

<TextBox Text="{Binding Path=Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />

在这种情况下,输入文本框中的内容应立即更新名称属性,但实际上并没有。如果我将名称属性更改为常规POCO属性,则可以正常工作(尽管双向绑定的另一侧除非我实现INotifyPropertyChanged,否则不起作用)。
我在这里做错了什么?这应该是一件非常简单的事情,但它给我带来了无尽的头痛。
2个回答

11

这是预期的行为。CLR属性只是对底层DependencyProperty的包装器。WPF经常通过直接调用GetValueSetValue进行优化。如果您需要执行自定义逻辑,则使用DependencyProperty的元数据。


天啊,我真是个白痴。你说得完全正确,值本身设置正确,但是 setter 从未被调用,这就是让我困惑的地方。谢谢。 - Matt Holmes

2

在这个问题上,我花费了一些时间:

对于那些遇到同样问题的人,但是像我一样没有在上面的答案中找到解决方案的人:

为了支持DataContext的继承,自定义类(在本例中为Context)必须派生自FrameworkElement而不是DependencyObject。就是这样。

Marc


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接