Estensione del markup RelativeSource

Specifica proprietà di un'origine di associazione RelativeSource, da utilizzare in un Associazione dell'estensione di markup o per l'impostazione della proprietà RelativeSource di un elemento Binding in XAML.

Utilizzo della sintassi XAML per gli attributi

<Binding RelativeSource="{RelativeSource modeEnumValue}" .../>

Utilizzo della sintassi XAML per gli attributi (annidati nell'estensione Binding)

<object property="{Binding RelativeSource={RelativeSource modeEnumValue} ...}" .../>

Utilizzo della sintassi XAML per gli elementi oggetto

<Binding>
  <Binding.RelativeSource>
    <RelativeSource Mode="modeEnumValue"/>
  </Binding.RelativeSource>
</Binding>
- or 
<Binding>
  <Binding.RelativeSource>
    <RelativeSource
      Mode="FindAncestor"
      AncestorType="{x:Type typeName}"
      AncestorLevel="intLevel"
    />
  </Binding.RelativeSource>
</Binding>

Valori XAML

modeEnumValue

Uno dei seguenti:

  • Token stringa Self; corrisponde a un oggetto RelativeSource creato con la proprietà Mode impostata su Self.

  • Token stringa TemplatedParent; corrisponde a un oggetto RelativeSource creato con la proprietà Mode impostata su TemplatedParent.

  • Token stringa PreviousData; corrisponde a un oggetto RelativeSource creato con la proprietà Mode impostata su PreviousData.

  • Per informazioni sulla modalità FindAncestor, vedere di seguito.

FindAncestor

Token stringa FindAncestor. Con questo token si accede a una modalità in cui RelativeSource specifica un tipo predecessore e facoltativamente un livello predecessore. Corrisponde a un oggetto RelativeSource creato con la proprietà Mode impostata su FindAncestor.

typeName

Obbligatorio per la modalità FindAncestor. Nome di un tipo che riempie la proprietà AncestorType.

intLevel

Facoltativo per la modalità FindAncestor. Livello predecessore (valutato nella direzione padre dell'albero logico).

Note

Gli usi dell'associazione {RelativeSource TemplatedParent} rappresentano una tecnica importante che indirizza un concetto più ampio di separazione di un'interfaccia utente di controllo e una logica di controllo. Ciò consente l'associazione dall'interno della definizione del modello al padre basato su modelli (istanza dell'oggetto in fase di esecuzione in cui il modello è applicato). In questo caso, Estensione del markup TemplateBinding è in effetti una forma abbreviata per la seguente espressione di associazione: {Binding RelativeSource={RelativeSource TemplatedParent}}. TemplateBinding o gli utilizzi di {RelativeSource TemplatedParent} sono entrambi attinenti solo all'interno del codice XAML che definisce un modello. Per ulteriori informazioni, vedere Estensione del markup TemplateBinding.

{RelativeSource FindAncestor} viene utilizzato prevalentemente nei modelli di controllo o nelle composizioni interfaccia utente complete prevedibili, per i casi in cui si prevede che un controllo sia sempre in una struttura ad albero visuale di un determinato tipo di predecessore. Ad esempio, gli elementi di un controllo di elementi potrebbero utilizzare FindAncestor per associarsi alle proprietà del relativo predecessore padre del controllo di elementi. In alternativa, per gli elementi che fanno parte della composizione del controllo nel modello possono utilizzare le associazioni FindAncestor agli elementi padre nella stessa struttura della composizione.

Nella sintassi dell'elemento oggetto per la modalità FindAncestor illustrata nelle sezioni sulla sintassi XAML, la sintassi del secondo elemento oggetto viene utilizzata specificamente per la modalità FindAncestor. La modalità FindAncestor richiede un valore AncestorType. È necessario impostare AncestorType come attributo utilizzando un riferimento Estensione del markup x:Type al tipo di predecessore da cercare. Il valore AncestorType viene utilizzato quando la richiesta di associazione viene elaborata in fase di esecuzione.

Per la modalità FindAncestor, la proprietà AncestorLevel facoltativa consente di rendere meno ambigua la ricerca del predecessore nei casi in cui vi sono più predecessori di tale tipo nella struttura ad albero dell'elemento.

Per ulteriori informazioni su come utilizzare la modalità FindAncestor, vedere RelativeSource.

{RelativeSource Self} è utile per gli scenari in cui la proprietà di un'istanza deve dipendere dal valore di un'altra proprietà della stessa istanza e non esiste già alcuna relazione generale della proprietà di dipendenza (come la coercizione) tra queste due proprietà. Sebbene sia raro che esistano due proprietà su un oggetto in modo che i valori siano letteralmente identici (e sono immessi in modo identico), è anche possibile applicare un parametro Converter a un'associazione con {RelativeSource Self} e utilizzare il convertitore per convertire i tipi di origine e destinazione. Un altro scenario per {RelativeSource Self} è una parte di un MultiDataTrigger.

Ad esempio, nel codice XAML seguente viene definito un elemento Rectangle in modo che, indipendentemente dal valore inserito per Width, Rectangle è sempre un quadrato: <Rectangle Width="200" Height="{Binding RelativeSource={RelativeSource Self}, Path=Width}" .../>

{RelativeSource PreviousData} è utile nei modelli di dati oppure nei casi in cui le associazioni utilizzano un insieme come origine dati. È possibile utilizzare {RelativeSource PreviousData} per evidenziare le relazioni tra gli elementi di dati adiacenti nell'insieme. Una tecnica correlata è di stabilire un MultiBinding tra l'elemento corrente e quello precedente nell'origine dati e utilizzare un programma di conversione su quel collegamento per determinare la differenza tra i due elementi e le relative proprietà.

Nell'esempio riportato di seguito, il primo TextBlock in un modello di elementi visualizza il numero corrente. La seconda associazione TextBlock è un oggetto MultiBinding che nominalmente presenta due componenti Binding: il record corrente e un'associazione che utilizza intenzionalmente il record di dati precedente utilizzando {RelativeSource PreviousData}. Quindi, un convertitore su MultiBinding calcola la differenza e la restituisce all'associazione.

        <ListBox Name="fibolist">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                    <TextBlock Text="{Binding}"/>
                    <TextBlock>, difference = </TextBlock>
                        <TextBlock>
                            <TextBlock.Text>
                                <MultiBinding Converter="{StaticResource DiffConverter}">
                                    <Binding/>
                                    <Binding RelativeSource="{RelativeSource PreviousData}"/>
                                </MultiBinding>
                            </TextBlock.Text>
                        </TextBlock>
                    </StackPanel>
                    </DataTemplate>
            </ListBox.ItemTemplate>

La descrizione dell'associazione dati come concetto non viene trattata in questo argomento; vedere Cenni preliminari sull'associazione dati.

Nell'implementazione del processore XAML WPF, la gestione di questa estensione di markup viene definita dalla classe RelativeSource.

RelativeSource è un'estensione di markup. Le estensioni di markup in genere vengono implementate quando per i valori dell'attributo devono essere utilizzati caratteri escape in modo che non vengano considerati come valori letterali o nomi di gestori e il requisito è più globale del semplice utilizzo di convertitori dei tipi su alcuni tipi o proprietà. Per tutte le estensioni di markup in XAML vengono utilizzati i caratteri { e } nella relativa sintassi degli attributi, vale a dire la convenzione in base alla quale il processore XAML riconosce che l'attributo deve essere elaborato da un'estensione di markup. Per ulteriori informazioni, vedere Estensioni di markup e XAML WPF.

Vedere anche

Riferimenti

Binding

Estensione del markup x:Type

Concetti

Applicazione di stili e modelli

Cenni preliminari su XAML (WPF)

Estensioni di markup e XAML WPF

Cenni preliminari sull'associazione dati

Cenni preliminari sulle dichiarazioni di associazione