绑定是不是仅适用于 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>

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

我认为,由于 ValuetypeObject,也就是说,它可以容纳任何类型的实例。它可以保存一个偶数 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 方法?

MVC 模型绑定到列表 - 仅适用于列表中的第一项

setPointerCapture 是不是仅适用于 pointerDown 事件?

Java中的“switch”语句是不是仅适用于整数? [复制]

libtorrent-rasterbar 的 python 绑定是不是适用于 Python 3?