Extension de balisage {TemplateBinding}

Lie la valeur d’une propriété dans un modèle de contrôle à la valeur d’une autre propriété exposée sur le contrôle modèle. TemplateBinding ne peut être utilisé que dans une définition ControlTemplate en XAML.

Utilisation des attributs XAML

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

Utilisation des attributs XAML (pour la propriété Setter dans le modèle ou le style)

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

Valeurs XAML

Terme Description
propertyName Nom de la propriété définie dans la syntaxe setter. Il doit s’agir d’une propriété de dépendance.
sourceProperty Nom d’une autre propriété de dépendance qui existe sur le type en cours de modèle.

Notes

L’utilisation de TemplateBinding fait partie intégrante de la façon dont vous définissez un modèle de contrôle, soit si vous êtes un auteur de contrôle personnalisé, soit si vous remplacez un modèle de contrôle pour les contrôles existants. Pour plus d’informations, consultez Démarrage rapide : Modèles de contrôle.

Il est assez courant pour propertyName et targetProperty d’utiliser le même nom de propriété. Dans ce cas, un contrôle peut définir une propriété sur elle-même et transférer la propriété à une propriété existante et intuitivement nommée d’une de ses parties de composant. Par exemple, un contrôle qui incorpore un TextBlock dans sa composition, qui est utilisé pour afficher la propriété Text du contrôle, peut inclure ce code XAML dans le modèle de contrôle : <TextBlock Text="{TemplateBinding Text}" .... />

Les types utilisés comme valeur pour la propriété source et la propriété cible doivent correspondre. Il n’est pas possible d’introduire un convertisseur lorsque vous utilisez TemplateBinding. L’échec de la correspondance des valeurs entraîne une erreur lors de l’analyse du code XAML. Si vous avez besoin d’un convertisseur, vous pouvez utiliser la syntaxe détaillée pour une liaison de modèle telle que : {Binding RelativeSource={RelativeSource TemplatedParent}, Converter="..." ...}

La tentative d’utilisation d’un TemplateBinding en dehors d’une définition ControlTemplate en XAML entraîne une erreur d’analyseur.

Vous pouvez utiliser TemplateBinding pour les cas où la valeur parente modèle est également différée comme une autre liaison. L’évaluation de TemplateBinding peut attendre que les liaisons d’exécution requises aient des valeurs.

Un TemplateBinding est toujours une liaison unidirectionnelle. Les deux propriétés doivent toutes être des propriétés de dépendance.

TemplateBinding est une extension de balisage. Les extensions de balisage sont généralement implémentées pour éviter que les valeurs d’attribut ne soient autre chose que des valeurs littérales ou des noms de gestionnaire et lorsque l’exigence dépasse le cadre de la définition de convertisseurs de type sur certains types ou propriétés. Toutes les extensions de balisage en XAML utilisent les caractères « { » et « } » dans leur syntaxe d’attribut, c’est-à-dire la convention par laquelle un processeur XAML reconnaît qu’une extension de balisage doit traiter l’attribut.

Remarque Dans l’implémentation du processeur XAML Windows Runtime, il n’existe aucune représentation de classe de stockage pour TemplateBinding. TemplateBinding est exclusivement utilisé dans le balisage XAML. Il n’existe pas de moyen simple de reproduire le comportement dans le code.

x :Bind dans ControlTemplate

Remarque

L’utilisation de x :Bind dans un ControlTemplate nécessite Windows 10, version 1809 (SDK 17763) ou ultérieure. Pour plus d’informations sur les versions cibles, voir Code adaptatif de version.

À compter de Windows 10, version 1809, vous pouvez utiliser l’extension de balisage x :Bind n’importe où vous utilisez TemplateBinding dans un ControlTemplate.

La propriété TargetType est obligatoire (non facultative) sur ControlTemplate lors de l’utilisation de x :Bind.

Avec la prise en charge de x :Bind , vous pouvez utiliser les liaisons de fonction ainsi que les liaisons bidirectionnelle dans un ControlTemplate.

Dans cet exemple, la propriété TextBlock.Text prend la valeur Button.Content.ToString. TargetType sur le ControlTemplate agit comme source de données et accomplit le même résultat qu’un TemplateBinding à parent.

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