每个绑定通常都包含以下四个组件:绑定目标 对象,目标属性,绑定 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)。
如果我错了,请纠正我。
答案 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控件,我强烈建议您查看各自的工具包。它们的评论很普遍,有些控件使用了很酷的代码。