Estensione di markup {TemplateBinding}

Collega il valore di una proprietà in un modello di controllo come valore di altre proprietà esposte sul controllo basato su modelli. TemplateBinding può essere utilizzato solo all'interno di una definizione di ControlTemplate in XAML.

Utilizzo attributo XAML

<object propertyName="{TemplateBinding sourceProperty}" .../>

Utilizzo dell'attributo XAML (per proprietà Set in modelli o stili)

<Setter Property="propertyName" Value="{TemplateBinding sourceProperty}" .../>

Valori XAML

Termine Descrizione
propertyName Il nome della proprietà impostata nella sintassi del setter. Questa deve essere una proprietà di dipendenza.
sourceProperty Il nome di un'altra proprietà di dipendenza esistente nel tipo basato su modelli.

Osservazioni:

L'uso di TemplateBinding è una parte fondamentale del modo in cui si definisce un modello di controllo, se si è un autore di controlli personalizzati o se si sostituisce un modello di controllo per i controlli esistenti. Per altre info, vedere Guida introduttiva: Modelli di controllo.

È piuttosto comune per propertyName e targetProperty usare lo stesso nome di proprietà. In questo caso, un controllo può definire una proprietà su se stessa e inoltrare la proprietà a una proprietà esistente e denominata in modo intuitivo di una delle relative parti del componente. Ad esempio, un controllo che incorpora una TextBlock nella composizione, che viene usato per visualizzare la proprietà Text del controllo, può includere questo codice XAML come parte del modello di controllo: <TextBlock Text="{TemplateBinding Text}" .... />

I tipi usati come valore per la proprietà di origine e la proprietà di destinazione devono corrispondere. Non è possibile introdurre un convertitore quando si usa TemplateBinding. La mancata corrispondenza dei valori genera un errore durante l'analisi del codice XAML. Se è necessario un convertitore, è possibile usare la sintassi dettagliata per un'associazione di modelli, ad esempio: {Binding RelativeSource={RelativeSource TemplatedParent}, Converter="..." ...}

Se si tenta di usare un oggetto TemplateBinding all'esterno di una definizione ControlTemplate in XAML verrà generato un errore parser.

È possibile usare TemplateBinding per i casi in cui anche il valore padre basato su modelli viene posticipato come un'altra associazione. La valutazione per TemplateBinding può attendere fino a quando le associazioni di runtime necessarie non hanno valori.

Un TemplateBinding è sempre un'associazione unidirezionale. Entrambe le proprietà in questione devono essere proprietà di dipendenza.

TemplateBinding è 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, vale a dire la convenzione in base a cui il processore XAML riconosce che l'attributo deve essere elaborato da un'estensione di markup.

Nota Nell'implementazione del processore XAML di Windows Runtime non esiste alcuna rappresentazione della classe di backup per TemplateBinding. TemplateBinding è destinato esclusivamente all'uso nel markup XAML. Non esiste un modo semplice per riprodurre il comportamento nel codice.

x:Bind in ControlTemplate

Nota

L'uso di x:Bind in un ControlTemplate richiede Windows 10 versione 1809 (SDK 17763) o versioni successive. Per altre info sulle versioni di destinazione, vedere Codice adattivo per la versione.

A partire da Windows 10 versione 1809, è possibile usare l'estensione di markup x:Bind ovunque si usi TemplateBinding in un oggetto ControlTemplate.

La proprietà pargetType è obbligatoria (non facoltativa) in ControlTemplate quando si usa x:Bind.

Con il supporto di x:Bind, è possibile usare entrambe le associazioni di funzione e le associazioni bidirezionali in un controlTemplate.

In questo esempio la proprietà TextBlock.Text restituisce Button.Content.ToString. TargetType in ControlTemplate funge da origine dati e ottiene lo stesso risultato di TemplateBinding a padre.

<ControlTemplate TargetType="Button">
    <Grid>
        <TextBlock Text="{x:Bind Content, Mode=OneWay}"/>
    </Grid>
</ControlTemplate>