绑定是否仅适用于DependencyProperty?

Naw*_*waz 11 wpf setter binding dependency-properties

MSDN说,

  • 每个绑定通常具有以下四个组件:绑定目标对象,目标属性,绑定源以及要使用的绑定源中的值的路径.例如,如果要将TextBox的内容绑定到Employee对象的Name属性,则目标对象是TextBox,target属性是Text属性,要使用的值是Name,源对象是员工对象.

  • target属性必须是依赖项属性.

上面的摘录解释了为什么以下代码有效,

<TextBox Text="{Binding EmployeeName}">
Run Code Online (Sandbox Code Playgroud)

它起作用,因为Text是一个依赖属性.到目前为止,一切都很好!


我的问题是,

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

<Style TargetType="{x:Type TextBox}">
      <Setter Property="Text" Value="{Binding EmployeeName}"/>
</Style>
Run Code Online (Sandbox Code Playgroud)

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

我想,既然该类型对象,这意味着,它可以保存任何类型的实例.它可以包含偶数Binding类型的实例.但是,它不能参与评估(或解析)Binding表达式的过程,因为它不是依赖属性.所以Style对象只是简单地将这个Binding对象(Value保持)从Setter转移到TextBox,而不评估/解析Binding值.因此,上面的Setter变得等同于:

 Text="{Binding EmployeeName}"
Run Code Online (Sandbox Code Playgroud)

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

就像Setter是邮差一样,Value本身就是postman的Bag,Binding实例(即Value持有的)是一封信.Postman(即Setter)将字母(即绑定实例)传递给目标(即Text属性),而不打开它,即不知道Letter携带什么Message(即EmployeeName).

如果我错了,请纠正我.

Rob*_*ney 4

XAML 设置Setter.Value为类型的对象BindingStyle然后,创建的对象将Text目标对象上的依赖属性设置为 that Binding,以便Text每当源属性更改时绑定都会更新。

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