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.