2009-03-10 8 views
12

Quali sono le differenze tra fare un autoreferenziale vincolante tramite nome o autoreferenziale tramite RelativeSource?Differenze tra ElementName = "<Me>" e RelativeSource self?

Ad esempio:

<!-- Self referential via name --> 
<Window ... 
    x:Name="This" 
    DataContext="{Binding Path=Data, ElementName=This}"/> 

contro

<!-- Self referential via RelativeSource --> 
<Window ... 
    x:Name="This" 
    DataContext="{Binding Path=Data, RelativeSource={RelativeSource Self}}"/> 

Nel mio progetto sembrano comportarsi in modo identico, ma sto usando direttamente in una finestra. Ciò significa che preferisco immediatamente il primo perché è meno digitante.

È l'unico vantaggio di RelativeSource la sua capacità di essere autoreferenziale in (ad esempio) uno stile ampiamente utilizzato? O c'è qualche differenza semantica aggiuntiva?

risposta

8

Caveat: Non una procedura guidata WPF

Quando si sono vincolanti direttamente su un elemento WPF come nel tuo esempio non c'è alcuna differenza. "Questo" è risolvibile e si legherà allo stesso oggetto del Sé.

Il mio sospetto è che la differenza si trova quando si sta vincolando tramite costrutti come Stile. In tal caso, ciò che vuoi effettivamente associare è l'elemento a cui è applicato lo stile. In questo caso, RelativeSource Self ti darà quell'elemento dove "this" ti darà solo un'istanza Style.

+1

Questa era l'unica cosa che potevo pensare o trovare, anche. Ho incontrato molte altre domande su: WPF, dove mi mancavano le informazioni, quindi volevo vedere se qualcun altro avesse qualcosa su questo. Grazie, Jared. :) –

-1

Perché pensi che ci sia una differenza tra loro? Penso che dovrebbero essere identici, dal momento che sono due modi di riferirsi allo stesso elemento.

+0

'I think' e 'should' non costituiscono una risposta. Valutare come ogni metodo risolve l'obiettivo e gli scenari che possono causare differenze. Vedi la risposta di JaredPar. – Gusdor

2

Se si tende a rifattorizzare i nomi dei propri controlli molto, allora l'uso del modulo di autorifrazione potrebbe essere più desiderabile altrimenti direi che è una chiamata che farei in base alle prestazioni. Costruisci un piccolo test e vedi quale tipo di legame si comporta meglio e scegli quello. Se la differenza di prestazioni è trascurabile, prenderei sicuramente in considerazione altre considerazioni sulla manutenibilità come l'aspetto generale e il tempo di scrittura. Inoltre, non dimenticare che quando si utilizza il modulo autoreferenziale non è necessario denominare il proprio elemento, quindi è necessario includere il requisito di denominazione aggiuntivo per il modulo ElementName quando si confrontano il tipo di digitazione e il cambio di contesto tra mouse e tastiera.

Personalmente preferisco i moduli di associazione referenziale quando ha senso ai fini del più semplice refactoring e il fatto che non devo spostarmi attorno al mio documento XAML per aggiungere un nome di elemento quando ho impostato il binding.