Estensione di markup {RelativeSource}
Fornisce un mezzo per specificare l'origine di un'associazione in termini di relazione relativa nel grafico degli oggetti di runtime.
Utilizzo degli attributi XAML (modalità self)
<Binding RelativeSource="{RelativeSource Self}" .../>
-or-
<object property="{Binding RelativeSource={RelativeSource Self} ...}" .../>
Utilizzo degli attributi XAML (modalità TemplatedParent)
<Binding RelativeSource="{RelativeSource TemplatedParent}" .../>
-or-
<object property="{Binding RelativeSource={RelativeSource TemplatedParent} ...}" .../>
Valori XAML
Termine | Descrizione |
---|---|
{RelativeSource: Self} | Produce un valore Mode di Self. L'elemento di destinazione deve essere usato come origine per questa associazione. Ciò è utile per l'associazione di una proprietà di un elemento a un'altra proprietà sullo stesso elemento. |
{RelativeSource TemplatedParent} | Produce un oggetto ControlTemplate applicato come origine per questa associazione. Ciò è utile per applicare le informazioni di runtime alle associazioni a livello di modello. |
Osservazioni:
Un binding può impostare Binding.RelativeSource come attributo su un elemento oggetto Binding o come componente all'interno di un'estensione di markup {Binding}. Ecco perché vengono visualizzate due diverse sintassi XAML.
RelativeSource è simile all'estensione di markup {Binding}. Si tratta di un'estensione di markup in grado di restituire istanze di se stesso e di supportare una costruzione basata su stringa che essenzialmente passa un argomento al costruttore. In questo caso, l'argomento passato è il valore Mode.
La modalità Self è utile per l'associazione di una proprietà di un elemento a un'altra proprietà sullo stesso elemento ed è una variante dell'associazione ElementName , ma non richiede la denominazione e quindi il riferimento automatico all'elemento. Se si associa una proprietà di un elemento a un'altra proprietà sullo stesso elemento, le proprietà devono utilizzare lo stesso tipo di proprietà oppure è necessario utilizzare anche un Converter nell'associazione per convertire i valori. Ad esempio, è possibile usare Height come origine per Width senza conversione, ma è necessario un convertitore per usare IsEnabled come origine per Visibility.
Ecco un esempio. Questo Rettangolo usa una estensione d markup {Binding} in modo che le sue Altezza e Larghezza siano sempre uguali e venga eseguito il rendering come quadrato. Solo l'altezza è impostata come valore fisso. Per questo Rettangolo il valore predefinito di DataContext è null, non questo. Per stabilire l'origine del contesto dati come oggetto stesso (e abilitare l'associazione alle altre proprietà) viene usato l'argomento RelativeSource={RelativeSource Self}
nell'utilizzo dell'estensione di markup {Binding}.
<Rectangle
Fill="Orange" Width="200"
Height="{Binding RelativeSource={RelativeSource Self}, Path=Width}"
/>
Un altro uso di RelativeSource={RelativeSource Self}
è un modo per impostare DataContext di un oggetto su se stesso. Ad esempio, è possibile visualizzare questa tecnica in alcuni esempi dell'SDK in cui la classe Page è stata estesa con una proprietà personalizzata che fornisce già un modello di visualizzazione pronto per il proprio data binding, ad esempio: <common:LayoutAwarePage ... DataContext="{Binding DefaultViewModel, RelativeSource={RelativeSource Self}}">
Nota L'utilizzo XAML per RelativeSource mostra solo l'utilizzo per il quale è previsto: impostare un valore per Binding.RelativeSource in XAML come parte di un'espressione di associazione. Teoricamente, altri utilizzi sono possibili se si imposta una proprietà in cui il valore è RelativeSource.