【发布时间】:2011-05-18 00:01:35
【问题描述】:
每个绑定通常具有以下四个组件: 绑定目标 对象、目标属性、绑定 源和路径中的值 要使用的绑定源。例如,如果 你想绑定 a 的内容 TextBox 到 Name 属性 Employee对象,你的目标对象是 TextBox,目标属性是 Text 属性,使用的值为 名称,源对象是 员工对象。
目标属性必须是依赖属性。
上面的摘录解释了为什么下面的代码可以工作,
<TextBox Text="{Binding EmployeeName}">
之所以有效,是因为 Text 是一个依赖属性。到目前为止,一切都很好!
我的问题是,
IF 目标属性必须是依赖属性才能使 Binding 工作,那么下面的 Setter 是如何工作的呢?请注意,Setter 中的 Value 不是依赖属性!
<Style TargetType="{x:Type TextBox}">
<Setter Property="Text" Value="{Binding EmployeeName}"/>
</Style>
我有一个解释。但我不确定这是否正确。让我先解释一下,然后,如果我错了,你们纠正我。 :-)
我认为,由于 Value 的 type 是 Object,也就是说,它可以容纳任何类型的实例。它可以保存一个偶数 Binding 类型的实例。 然而,它不能参与评估(或解析)Binding 表达式的过程,因为它不是依赖属性。 所以 Style 对象只是将这个 Binding 对象(Value 持有)从 Setter 转移到TextBox 本身,而不评估/解析 Binding 值。因此,上面的 Setter 就等同于:
Text="{Binding EmployeeName}"
而且从现在开始,Text 是一个依赖属性,它可以解析 Binding 值。 所以一开始看起来绑定的目标是Value,但实际上Text是绑定的目标。
就像 Setter 是一个邮递员,Value 本身就是邮递员的 Bag,Binding 实例(即 Value 所持有的)是一个 Letter。 Postman(即 Setter)将 Letter(即 Binding 实例)传递给 Target(即 Text 属性),而不打开它,即不知道 Letter 携带什么 Message(即 EmployeeName)。
如果我错了,请纠正我。
【问题讨论】:
-
真的有用吗?我尝试对 TreeViewItem 样式做类似的事情,但没有。
-
我的意思是在 Silverlight 中。 WPF 支持样式中的绑定定义。
-
@Lex Lavnikov.... 我最近没有在 Silverlight 中检查自己,我不记得我是否在 silverlight 的样式中使用过绑定。无论如何,您可以启动另一个线程来讨论它。你说什么?
-
@Nawaz - 这是一个非常愚蠢的问题。从我这边+1。这也是我最喜欢的问题!
-
@GuruC....感谢您的评论..:-)...是的,这是一个很好的问题...它实际上帮助我深入研究了依赖关系的机制属性和绑定一起工作!
标签: wpf binding dependency-properties setter