绑定是不是仅适用于 DependencyProperty?
Posted
技术标签:
【中文标题】绑定是不是仅适用于 DependencyProperty?【英文标题】:Does Binding work ONLY with DependencyProperty?绑定是否仅适用于 DependencyProperty? 【发布时间】:2011-05-18 00:01:35 【问题描述】:MSDN says,
每个绑定通常具有以下四个组件: 绑定目标 对象、目标属性、绑定 源和路径中的值 要使用的绑定源。例如,如果 你想绑定 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....感谢您的评论..:-)...是的,这是一个很好的问题...它实际上帮助我深入研究了依赖关系的机制属性和绑定一起工作! 【参考方案1】:没错。如果您查看WPF toolkit 控件的源代码,您可以了解它是如何完成的。 DataGrid 在很多地方执行此操作(例如,将 Content 绑定传递给单元格的特定列)。我会尽量记住添加一个指向特定文件和下班后完成的行的链接。
编辑
一个很好的例子是DataGridBoundColumn 类中的Binding
属性。你可以看到它在
internal void ApplyBinding(DependencyObject target, DependencyProperty property)
如果您对制作 WPF 和 Silverlight 控件的高级模式感兴趣,我强烈建议您查看它们各自的工具包。总的来说,它们的评论很好,并且一些控件使用了一些很酷的代码。
【讨论】:
...感谢您的回复...我将研究 DataGrid 的源代码..这对我来说似乎很有趣.. :-) .. 是的.. 如果你告诉我具体的文件和完成的行会很好.. :-)【参考方案2】:XAML 将Setter.Value
设置为Binding
类型的对象。这样创建的Style
然后将目标对象上的Text
依赖属性设置为Binding
,这样只要源属性发生变化,绑定就会更新Text
。
如果Setter.Value
是一个依赖属性,那么setter 最终会成为属性更改通知的中介:源属性更改,绑定通知setter,setter 通知目标。由于它只是一个 CLR 属性,因此 setter 并不实际参与更改通知:源属性更改,绑定通知目标。
【讨论】:
...感谢您的回复..第二段很棒..这对我来说非常有意义..:-)以上是关于绑定是不是仅适用于 DependencyProperty?的主要内容,如果未能解决你的问题,请参考以下文章
UILongPressGestureRecognizer 绑定仅适用于 UIImageView [重复]
Laravel Route 模型绑定(slug)仅适用于 show 方法?
setPointerCapture 是不是仅适用于 pointerDown 事件?