2013-10-08 26 views
41

Secondo la pagina x:Reference Markup Extension su MSDN, x:ReferenceQual è la differenza tra x: Reference e ElementName?

riferimento a un'istanza che viene dichiarato altrove in XAML markup. Il riferimento si riferisce a x di un elemento: Nome.

Secondo la pagina Binding.ElementName Property su MSDN, ElementName

Il valore della proprietà Name o x: Name Direttiva del elemento di interesse.

Guardando indietro alla sezione di osservazioni sulla prima pagina:

x: Reference e WPF

In WPF e XAML 2006, i riferimenti degli elementi vengono risolti con la funzione di livello quadro di ElementName vincolante. Per la maggior parte delle applicazioni e degli scenari WPF, è comunque necessario utilizzare il collegamento ElementName. Eccezioni a questa guida generale potrebbero includere casi in cui esistono dati contestuali o altre considerazioni sull'ambito dell'ambito che rendono impraticabile l'associazione dei dati e in cui la compilazione del markup non è coinvolta.

Per completezza, qui fa parte della sezione commenti sulla pagina ElementName:

Questa proprietà è utile quando si desidera associare alla proprietà di un altro elemento nella vostra applicazione. Ad esempio, se si desidera utilizzare un dispositivo di scorrimento per controllare l'altezza di un altro controllo nell'applicazione o se si desidera associare il contenuto del controllo alla proprietà SelectedValue del controllo ListBox.

Ora, mentre io sono pienamente consapevole di quando e come utilizzare la proprietà ElementName, non capisco appieno la differenza tra questo e l'estensione x:Reference markup. Qualcuno può spiegare questo e, in particolare, espandere sull'ultima frase mostrata dalla sezione x:Reference osservazioni ?:

Le eccezioni a questa guida generale potrebbe includere casi in cui vi siano contesto dati o di altre considerazioni di scoping che rendono impraticabile associazione dati e dove la compilazione del markup non è coinvolta.

risposta

48

Fondamentalmente come hai detto quei due fanno quasi la stessa cosa. Tuttavia ci sono piccole differenze nel cofano.

{x:Reference ...} -> restituisce solo un riferimento di un oggetto che non crea quel "ponte" tra due proprietà come il collegamento farebbe. Dietro a tutto ciò viene utilizzato un servizio che cerca il nome specificato in un ambito specifico che di solito è la finestra stessa.

{Binding ElementName="..." } -> prima di tutto crea quell'oggetto vincolante quindi cerca il nome dell'oggetto ma non utilizzando la stessa tecnica sotto il cofano come x: Riferimento. L'algoritmo di ricerca si sposta verso l'alto e/o verso il basso in VisualTree per trovare l'elemento desiderato. Pertanto è sempre necessario un VisualTree funzionale. Ad esempio se usato all'interno di un non-UiElement, non funzionerà. Alla fine il legame rimane e fa il suo pane quotidiano.

Questo non funziona:

<StackPanel> 
<Button x:name="bttn1" Visibility="Hidden">Click me</Button> 
<DataGrid> 
    <DataGrid.Columns> 
    <DataGridTextColumn Visibility="{Binding ElementName=bttn1, Path=DataContext.Visibility}"/> 
.... 

questo funziona:

<StackPanel> 
<Button x:name="bttn1" Visibility="Hidden">Click me</Button> 
<DataGrid> 
    <DataGrid.Columns> 
    <DataGridTextColumn Visibility="{Binding Source={x:Reference bttn1}, Path=DataContext.Visibility}"/> 
.... 

Un po 'come questo :)

+1

Quindi la differenza principale riguarda se un controllo è un 'UIElement' o no? – Sheridan

+10

+1. A proposito, hai una fonte per queste informazioni, o è solo per esperienza? Una cosa che non è stata menzionata qui è che un bambino non può 'x: Reference' suo genitore (questa relazione sembra dipendere dal contesto, piuttosto che dall'albero visivo) perché ciò causa un problema di riferimento circolare. A volte anche il riferimento fallirà silenziosamente a causa di altri misteriosi problemi. – GregRos

+0

La fonte di queste informazioni è il codice sorgente stesso :) –

0

ElementName è specifica piattaforma. Cioè può o meno essere presente in base alla piattaforma che stai utilizzando. x: Reference eleva tale concetto a una funzione nativa XAML. Pertanto qualsiasi piattaforma che supporti XAML supporta x: Reference.

Problemi correlati