绑定是否仅适用于DependencyProperty?

时间:2010-11-30 16:44:11

标签: wpf binding dependency-properties setter

MSDN says,

  
      
  • 每个绑定通常都包含以下四个组件:绑定目标   对象,目标属性,绑定   source,以及该值中的路径   绑定源使用。例如,如果   你想绑定一个的内容   TextBox到Name的Name属性   Employee对象,你的目标对象是   TextBox,目标属性是   Text属性,要使用的值是   名称和源对象是   员工对象。

  •   
  • 目标属性必须是依赖属性。

  •   

上面的摘录解释了以下代码的工作原理,

<TextBox Text="{Binding EmployeeName}">

它的工作原理是因为 Text 是依赖属性。到目前为止,一切都很好!


我的问题是,

如果目标属性必须是绑定的依赖属性才能工作,那么下面的 Setter 如何工作?请注意,Setter中的不是依赖属性!

<Style TargetType="{x:Type TextBox}">
      <Setter Property="Text" Value="{Binding EmployeeName}"/>
</Style>

我有一个解释。但我不确定这是否正确。让我先解释一下,然后,如果我错了,你们要纠正我。 : - )

我认为,由于 Value 类型对象,这意味着它可以容纳任何类型的实例。它可以包含偶数Binding类型的实例。 然而,它不能参与评估(或解析)Binding表达式的过程,因为它不是依赖属性。所以Style对象只是将这个Binding对象(Value保持)从Setter转移到这样的TextBox,不评估/解析Binding值。因此,上述Setter等同于:

 Text="{Binding EmployeeName}"

从现在开始,Text是一个依赖属性,它可以解析Binding值。 首先看来绑定的目标是Value,但实际上,Text是绑定的目标。

就像Setter是邮差一样,Value本身就是postman的Bag,Binding实例(即Value持有)是一封信。邮差(即Setter)将信件(即绑定实例)发送给目标(即文本属性),而不打开它,即不知道信件携带的是什么消息(即EmployeeName)。

如果我错了,请纠正我。

2 个答案:

答案 0 :(得分:4)

XAML正在将Setter.Value设置为Binding类型的对象。这样创建的Style然后将目标对象上的Text依赖项属性设置为Binding,这样只要源属性发生更改,绑定就会更新Text

如果Setter.Value是依赖属性,则setter最终将成为属性更改通知中的中介:source属性更改,绑定通知setter,setter通知目标。由于它只是一个CLR属性,因此setter实际上并未参与更改通知:源属性更改,绑定通知目标。

答案 1 :(得分:2)

这是对的。如果您查看WPF toolkit控件的源代码,您可以看到它是如何完成的。 DataGrid在很多地方(例如,将内容绑定传递给单元格的特定列)执行此操作。我会尽量记住在工作后添加指向特定文件和行的链接。

修改 一个很好的例子是DataGridBoundColumn类中的Binding属性。您可以在

中看到它
internal void ApplyBinding(DependencyObject target, DependencyProperty property)

如果您对高级模式感兴趣以制作WPF和Silverlight控件,我强烈建议您查看各自的工具包。它们的评论很普遍,有些控件使用了很酷的代码。