2013-08-16 16 views
6

Dla lepszego zrozumienia powiązań WPF:Style i Wiązania w 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> 

Kiedy używam tego stylu na wielu przycisków, Zakładam, że styl jest tworzony tylko te. Co to oznacza dla wiązania? Czy mam tylko jedno wiązanie (tj. Jeden obiekt wiążący), a przycisk 1 i przycisk 2 odwołują się do tego obiektu wiążącego? Jeśli tak, to kiedy i jak zidentyfikowano źródło powiązania, gdy przyciski 1 i 2 są używane jako część różnych elementów sterujących My: Control? Mam tu na myśli odniesienie do obiektu źródłowego, a nie do wartości źródła? Czy ktoś może wskazać mi jakieś specyfikacje, jeśli tak jest powiedziane?

Odpowiedz

2

Zakładam, że styl jest tworzony tylko te

Tak, oto dowód, że przy użyciu kodu

enter image description here

Czy mam tylko jeden Binding (czyli jeden Binding-Object) a przycisk 1 i przycisk 2 odnoszą się do tego obiektu wiążącego?

Tak, ponieważ styl utrzymuje wiązanie, a obiekty są takie same (dosłownie), to wiązanie musi być takie samo.

enter image description here

Jeśli tak, to kiedy i jak jest źródłem wiązanie zidentyfikowane podczas button1 i button2 są wykorzystywane jako część różnych My: kontroli sterowania?

Kiedy: Kiedy drzewo wizualny jest renderowany powiązania są oceniane przez chodzenie do kontroli określonej przez FindAncestor

Jak: Teraz mówisz szczegółów implementacji. Chociaż nie wiem dokładnie jak FindAncestor dzieła (jeden sposób, aby zobaczyć to przez .NET Reflector), to prawdopodobnie używa VisualTreeHelper.GetParent(...)

EDIT:

BindingExpression nie jest przywiązany do Binding obiektu , ale możesz to łatwo uzyskać.

enter image description here

Jak oczekiwano, oba przyciski mają różne BindingExpression ale samo Binding przedmiot. BindingExpression wiąże się z Target z Source. W tym przypadku, ResolvedSource jest null w wyniku korzystania RelativeSource do znalezienia obiektu

enter image description here

+0

Poprosiłem samą qestion do znajomego. Wyjaśnił, że istnieje różnica między obiektem BindingExpression a obiektem Binding. To, co określiłem w stylu, to BindingExpression. A ponieważ styl jest tworzony tylko raz, prawdopodobnie istnieje również BindingExpression. Więc oba przyciski odnoszą się do tej samej BindingExpression. W pewnym momencie podczas wykonywania oceniany jest obiekt BindingExpression i tworzony jest obiekt Binding. W tym procesie tworzenia FindAncestor jest oceniany na podstawie aktualnej pozycji przycisku w drzewie.Na końcu każdy przycisk ma własny i inny obiekt wiązania. – user1182735

+0

Ogólnie to wyjaśnienie pasuje do Twojego wyjaśnienia, ale z jednym drobnym szczegółem. Rozróżnienie między obiektem Binding-object a obiektem BindingExpression. – user1182735

+1

Oba przyciski odnoszą się do tego samego wiązania, ale oba przyciski nie będą miały tego samego wyrażenia "BindingExpression", ponieważ "BindingExpression" zawiera informacje o "Target". – Shoe

Powiązane problemy