WPF中的样式和绑定

6

为更好地理解WPF绑定:

<Style x:Key="myButton" TargetType="Button">
  <Setter 
    Property="Content" 
    Value="{Binding 
             RelativeSource={RelativeSource FindAncestor,AncestorType=My:Control}, 
             Path=Text}">
  </Setter>
</Style>

<Button Name="button1" Style="{StaticResource myButton}"></Button>
<Button Name="button2" Style="{StaticResource myButton}"></Button>

当我在多个按钮上使用此样式时,我假设样式只被实例化一次。那么对于绑定来说意味着什么?我只有一个绑定(即一个绑定对象),button1和button2都引用这个绑定对象吗?如果是这样,当button1和button2被用作不同的My:Control控件的一部分时,绑定的源是何时以及如何被识别的?我的意思是指源对象的引用而不是源值。能否有人指向一些规范,说明了这一点?
1个回答

2

我假设样式只被实例化一次

是的,使用您的代码可以证明这一点

我只有一个绑定(即一个绑定对象),button1和button2都引用此一个绑定对象吗?

是的,因为样式保存了绑定,而对象是相同的(字面意义上),所以绑定必须是相同的。

如果是这样,当button1和button2被用作不同的My:Control控件的一部分时,如何识别绑定的源以及何时识别它?

何时:在可视树呈现时,通过向上遍历到由FindAncestor指定的控件来评估绑定

如何:现在你正在谈论实现细节。虽然我不知道FindAncestor的确切工作方式(通过.NET Reflector之一的方法),但它可能使用VisualTreeHelper.GetParent(...)

编辑:

BindingExpression没有与对象的Binding绑定,但您可以像这样轻松获取它。

enter image description here

如预期的那样,两个按钮具有不同的BindingExpression,但是相同的Binding对象。 BindingExpressionTargetSource绑定在一起。在这种情况下,由于使用RelativeSource查找属性,因此ResolvedSource为空

enter image description here


我向一个朋友问了同样的问题。他解释说BindingExpression和Binding-object之间有区别。我在Style中指定的是BindingExpression。由于Style只被实例化一次,BindingExpression也可能是如此。因此,两个按钮引用相同的BindingExpression。在执行过程中的某个时刻,BindingExpression被评估并创建了一个Binding-object。在这个创建过程中,FindAncestor基于按钮在树中的当前位置进行评估。最终,每个按钮都有自己不同的Binding-object。 - user1182735
一般来说,这个解释符合你的解释,但有一个小细节需要注意,那就是Binding对象和BindingExpression对象之间的区别。 - user1182735
1
两个按钮引用相同的绑定,但是两个按钮的BindingExpression不会相同,因为BindingExpression包含有关Target的信息。 - jamesSampica
啊,好的。看来我使用了正确的术语,但是交换了它们的含义。 - user1182735

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接