2013-08-16 104 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