Quelle est la liaison de modèle par rapport à la liaison?

118

Je ne pouvais pas comprendre BorderThickness="{TemplateBinding BorderThickness}. Voici le code:

<ControlTemplate TargetType="{x:Type wpftoolkit:DataGridCell}">
    <Border Padding="{TemplateBinding Padding}" 
            BorderBrush="{TemplateBinding BorderBrush}" 
            BorderThickness="{TemplateBinding BorderThickness}" 
            Background="{TemplateBinding Background}" 
            SnapsToDevicePixels="True">
        <ContentPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
    </Border>
</ControlTemplate>

Veuillez également expliquer les autres types de reliure.

prjndhi
la source
pourquoi ce retour et pourquoi BorderThickness écrit deux fois "" "BorderThickness =" {TemplateBinding BorderThickness} "" "
prjndhi
1
@Euphoric cette page semble être le premier résultat Google pour cette requête. ;)
ANeves

Réponses:

204

TemplateBinding est utilisé pour la liaison aux propriétés d'élément dans la définition de modèle. Dans votre exemple, vous auriez pu écrire

 <Border Padding="{Binding Padding}" ...>

ce qui signifie lier la propriété padding de la bordure à la propriété padding de ... quoi? Vous aimeriez dire "propriété de remplissage du contrôle pour lequel ce modèle est utilisé". Vous ne pouvez pas lui donner un nom car vous ne connaissez pas le x: Nom du contrôle pour le moment (même si vous le faisiez, cela ne fonctionnerait pas car il est dans une autre portée de nom). Cependant, vous pouvez le faire en définissant une source relative

<Border Padding="{Binding Padding, RelativeSource={RelativeSource TemplatedParent}" ...>

ou utilisez TemplateBinding qui est un raccourci (*) pour ci-dessus

<Border Padding="{TemplateBinding Padding}" ...>

(*) En plus d'être moins verbeux dans ces scénarios de modèles, TemplateBinding présente quelques différences par rapport à une liaison régulière:

  • Il est évalué au moment de la compilation. (si, par exemple, la propriété Padding n'existait pas, vous obtiendrez une erreur de compilation. Mais si vous utilisiez une liaison avec TemplatedParent, vous ne verriez l'erreur qu'au moment de l'exécution.)
  • C'est toujours une liaison à sens unique.
  • Cela nécessite que les propriétés source et cible soient des propriétés de dépendance .
  • Il a beaucoup moins de fonctionnalités (pas de StringFormat, Delay, IsAsync, etc. voir les propriétés de Binding vs TemplateBindingExtention ).
Eren Ersönmez
la source
58

Une image vaut mieux que mille mots. Dans ce cas, il s'agit d'une vidéo de 7 minutes: https://www.youtube.com/watch?v=z-0TZR-7xLI

EDIT: Exemple:

  • A Buttona une valeur par défaut la ControlTemplatepropriété et la Heightpropriété
  • Vous remplacez la ControlTemplatepropriété de a Buttonen écrivant la vôtre (par exemple, vous voulez créer un Ellipsebouton -looking au lieu de Rectangle-looking)
  • Après avoir créé un Ellipsedans votre nouveau ControlTemplate, vous voulez que la Ellipsetaille de la Heightpropriété Button d'origine
  • Donc , vous utilisez TemplateBindingpour référence Button« s Heightsans le nommerentrez la description de l'image ici
Mauvais
la source
Bien que cela puisse théoriquement répondre à la question, il serait préférable d'inclure ici les parties essentielles de la réponse et de fournir le lien pour référence.
Bhargav Rao
32

Eren Ersönmenz l'a déjà assez bien expliqué, mais je voudrais lui donner une autre perspective pour mieux comprendre le concept.

Dans WPF, chaque contrôle est plus ou moins détaché de sa présentation. Vous pouvez toujours modifier le modèle de contrôles et lui donner un aspect complètement différent. Un bouton fonctionne comme prévu avec un ControlTemplateseul composé d'un Rectanglepar exemple. Parfois, il est parfois nécessaire que le ControlTemplateutilise réellement les propriétés de la partie logique d'un contrôle. Et c'est TemplateBindingpour ça qu'il dit simplement ControlTemplate"Utiliser cette propriété du contrôle que nous donnons à la présentation visuelle". Un bon exemple est la Backgroundpropriété sur chaque contrôle, elle n'a aucune signification en elle-même, elle obtient sa signification par TemplateBindingelle au contrôle enfant dans le ControlTemplate.

La liaison en elle-même est très bien décrite dans le MSDN . C'est une très belle feuille de triche qui est en fait accrochée à mon mur juste à côté de moi. Il donne un bon aperçu de toutes les différentes fixations disponibles.

dowhilefor
la source
6

À partir de TemplateBinding Markup Extension , TemplateBindinglie 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 basé sur un modèle. En d'autres termes, il s'agit de lier des valeurs dans un modèle.

La liaison connecte une propriété de liaison de cibles et de sources de données.

Zabavsky
la source