2013-08-16 75 views
6

为了更好地理解WPF绑定:样式和绑定在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控件的一部分时,何时以及如何确定绑定的来源?我的意思是指引用源对象而不是源的值?有人可以指出我对某些规范的描述吗?

回答

2

我认为风格是唯一实例化的人

是的,这里是的,使用你的代码证明

enter image description here

难道我只有一个结合(即一个绑定对象)并且button1和button2引用了这个绑定对象?

是的,既然风格持有绑定和对象是相同的(字面上),那么绑定必须是相同的。

enter image description here

如果是的话,何时以及如何为Button1的时候BUTTON2和使用不同的我的一部分绑定识别来源:控制控件?

当:当视觉树呈现由步行到如何通过FindAncestor

指定的控制绑定进行评估:现在你在谈论的实现细节。虽然我不知道究竟是如何FindAncestor作品(见一个方式是通过.net反射),它可能使用VisualTreeHelper.GetParent(...)

编辑:

BindingExpression不依赖于对象的Binding ,但你可以很容易地得到它。

enter image description here

正如预期的那样,这两个按钮具有不同的BindingExpression但相同Binding对象。 BindingExpressionTargetSource联系起来。在这种情况下,ResolvedSource是空的使用RelativeSource找物业

enter image description here

+0

我问了同样的qestion朋友的结果。他解释说,BindingExpression和Binding对象是有区别的。我在Style中指定的是一个BindingExpression。由于Style只是一次实例化,所以BindingExpression也可能是一样的。所以这两个按钮引用相同的BindingExpression。在执行期间的某个时刻,评估BindingExpression并创建一个Binding-object。在此创建过程中,FindAncestor将根据树中按钮的当前位置进行评估。最后,每个按钮都有自己的和不同的绑定对象。 – user1182735

+0

一般来说,这个解释适合你的解释,但有一个小细节。 Binding-object和BindingExpression-object的区别。 – user1182735

+1

两个按钮都引用相同的绑定,但两个按钮都不会有相同的'BindingExpression',因为'BindingExpression'包含有关'Target'的信息。 – Shoe