2009-04-29 117 views
7

我们有一个从DependencyObject派生的对象,并实现了一些DependencyProperties。WPF中的自定义相关属性和双向绑定

基本上是这样的:

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从该属性格式,采用双向绑定。 TwoWay部分从来没有实际发生过,WPF从来没有调用过这个属性的集合。我已经把我的结合起来是这样的:

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

在这种情况下,在文本框中应立即更新Name属性打字,但事实并非如此。如果我将Name属性更改为常规POCO属性,它将起作用(尽管TwoWay的另一侧显然不会执行INotifyPropertyChanged)。

我在这里做错了什么?这应该是一件非常简单的事情,但这会让我头痛不已。

回答

11

这是预期的行为。 CLR财产仅仅是底层DependencyProperty的包装。 WPF经常通过直接呼叫GetValueSetValue进行优化。如果您需要自定义逻辑来执行,则使用DependencyProperty的元数据。

+0

哎呀,我是个白痴。你100%正确,价值本身设置正确,但是二传手永远不会被调用,这是通过我的。谢谢。 – 2009-04-29 17:31:10

2

后,这个问题我花了一些时间:

对于那些你们谁有同样的问题,但是 - 像我一样 - 不要看上面的答案解决方案:

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

Marc