2013-08-16 17 views
6

Per una migliore comprensione di attacchi WPF:stili e binding in 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> 

Quando uso questo stile su più pulsanti, io assumono lo stile viene istanziata solo quelli. Cosa significa per il legame? Ho un solo Binding (cioè un oggetto Binding) e il pulsante 1 e il pulsante 2 fanno riferimento a questo oggetto Binding? In tal caso, quando e come viene identificata la Sorgente del legame quando button1 e button2 vengono utilizzati come parte di diversi controlli My: Control? Con ciò intendo il riferimento all'oggetto sorgente e non il valore della fonte? Qualcuno può indicarmi delle specifiche in cui è indicato?

risposta

2

suppongo lo stile è istanziato solo quelli

Sì, qui è la prova di ciò utilizzando il codice

enter image description here

Devo solo una Binding (vale a dire un Binding-Object) e button1 e button2 fanno riferimento a questo oggetto Binding?

Sì, poiché lo stile contiene l'associazione e gli oggetti sono gli stessi (letteralmente), l'associazione deve essere la stessa.

enter image description here

In caso affermativo, quando e come è la fonte del legame identificati quando button1 e button2 vengono utilizzati come parte di diverse mio: controlli di controllo?

Quando: Quando l'albero è resa visiva le associazioni sono valutate a piedi fino al controllo specificato da FindAncestor

Come: Ora si sta parlando di dettagli di implementazione. Anche se non so esattamente come FindAncestor opere (un modo di vedere è attraverso .NET Reflector), utilizza probabilmente VisualTreeHelper.GetParent(...)

EDIT:

il BindingExpression non è legato alla Binding dell'oggetto , ma puoi facilmente ottenerlo in questo modo.

enter image description here

Come previsto, entrambi i pulsanti hanno differente BindingExpression ma la stessa Binding oggetto. Lo BindingExpression collega lo Target allo Source. In questo caso, ResolvedSource è nullo a causa di utilizzare RelativeSource per trovare la proprietà

enter image description here

+0

ho chiesto la stessa Qestion ad un amico. Ha spiegato che esiste una differenza tra BindingExpression e Binding-object. Quello che ho specificato nello stile è un'espressione vincolante. E poiché lo stile viene solo istanziato una volta, probabilmente anche BindingExpression. Quindi entrambi i pulsanti fanno riferimento alla stessa BindingExpression. Ad un certo punto durante l'esecuzione viene valutata l'espressione BindingExpression e viene creato un oggetto Binding. In questo processo di creazione, FindAncestor viene valutato in base alla posizione corrente del pulsante nella struttura.Alla fine ogni pulsante ha il suo oggetto Binding diverso. – user1182735

+0

In generale questa spiegazione si adatta alla tua spiegazione, ma con un dettaglio minore. La distinzione tra oggetto Binding-oggetto e oggetto BindingExpression. – user1182735

+1

Entrambi i pulsanti fanno riferimento allo stesso binding, ma entrambi i pulsanti non avranno lo stesso 'BindingExpression' perché' BindingExpression' contiene le informazioni su 'Target'. – Shoe