Condividi tramite


Estensione del markup RelativeSource

Specifica le proprietà di un'origine RelativeSource di associazione, da utilizzare all'interno di un'estensione di markup di binding o quando si imposta la RelativeSource proprietà di un Binding elemento stabilito in XAML.

Uso 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>

-oppure-

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

Valori XAML

Valore Descrizione
modeEnumValue Uno dei seguenti:

- Token stringa Self; corrisponde a come RelativeSource creato con la relativa Mode proprietà impostata su Self.
- Token stringa TemplatedParent; corrisponde a come RelativeSource creato con la relativa Mode proprietà impostata su TemplatedParent.
- Token stringa PreviousData; corrisponde a come RelativeSource creato con la relativa Mode proprietà impostata su PreviousData.
- Vedere di seguito per informazioni sulla FindAncestor modalità.
FindAncestor Token stringa FindAncestor. L'utilizzo di questo token consente di accedere 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).

Osservazioni

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

{RelativeSource FindAncestor} viene usato principalmente nei modelli di controllo o nelle composizioni dell'interfaccia utente prevedibili, per i casi in cui un controllo deve sempre trovarsi in una struttura ad albero visuale di un determinato tipo 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, gli elementi che fanno parte della composizione del controllo in un 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 usando un riferimento x:Type Markup Extension 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à facoltativa AncestorLevel consente di rendere meno ambigua la ricerca del predecessore laddove vi sono più predecessori di questo 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 una proprietà di un'istanza deve dipendere dal valore di un'altra proprietà della stessa istanza e non esiste già alcuna relazione di proprietà di dipendenza generale (ad esempio la coercizione) tra queste due proprietà. Anche se è raro che due proprietà esistano in un oggetto in modo che i valori siano letteralmente identici (e sono tipizzati in modo identico), è anche possibile applicare un Converter parametro a un'associazione con {RelativeSource Self}e usare il convertitore per convertire tra tipi di origine e di destinazione. Un altro scenario per {RelativeSource Self} è come parte di un oggetto MultiDataTrigger.

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

{RelativeSource PreviousData} è utile nei modelli di dati o nei casi in cui le associazioni usano una raccolta come origine dati. È possibile usare {RelativeSource PreviousData} per evidenziare le relazioni tra elementi di dati adiacenti nella raccolta. Una tecnica correlata consiste nel porre un oggetto MultiBinding tra l'elemento corrente e quello precedente nell'origine dati e utilizzare un convertitore su quell'associazione 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 TextBlock associazione è un MultiBinding oggetto che ha due Binding elementi costitutivi: il record corrente e un'associazione che usa deliberatamente il record di dati precedente usando {RelativeSource PreviousData}. Quindi, un convertitore applicato a 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>
</ListBox>

La descrizione del data binding come concetto non è descritta qui, vedere Panoramica del data binding.

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

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à. Tutte le estensioni di markup in XAML usano i { caratteri e } nella sintassi degli attributi, ovvero la convenzione con cui un processore XAML riconosce che un'estensione di markup deve elaborare l'attributo. Per altre informazioni, vedere Estensioni di markup e XAML WPF.

Vedi anche