ancestorlevel - WPF TemplateBinding vs RelativeSource TemplatedParent




wpf relativesource ancestorlevel (5)

Ils sont utilisés de la même manière, mais ils ont quelques différences. Voici un lien vers la documentation de TemplateBinding: http://msdn.microsoft.com/en-us/library/ms742882.aspx

Quelle est la différence entre ces 2 liaisons:

<ControlTemplate TargetType="{x:Type Button}">
   <Border BorderBrush="{TemplateBinding Property=Background}">
      <ContentPresenter />
   </Border>
</ControlTemplate>

et

<ControlTemplate TargetType="{x:Type Button}">
   <Border BorderBrush="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Background}">
      <ContentPresenter />
   </Border>
</ControlTemplate>

?


Je pensais que TemplateBinding ne supporte pas les types Freezable (qui incluent les objets brush). Pour contourner le problème. On peut faire usage de TemplatedParent


TemplateBinding est un raccourci pour Binding avec TemplatedParent mais il n'expose pas toutes les capacités de la classe Binding, par exemple vous ne pouvez pas contrôler Binding.Mode à partir de TemplateBinding.


TemplateBinding n'est pas tout à fait la même chose. Les documents MSDN sont souvent écrits par des personnes qui doivent interroger les SDE monosyllabiques sur les fonctionnalités logicielles. Les nuances ne sont donc pas tout à fait correctes.

Les TemplateBindings sont évalués au moment de la compilation par rapport au type spécifié dans le modèle de contrôle. Cela permet une instanciation beaucoup plus rapide des modèles compilés. Juste tâtonner le nom dans un templatebinding et vous verrez que le compilateur le signalera.

Le balisage de liaison est résolu au moment de l'exécution. Bien que plus lent à exécuter, la liaison résoudra les noms de propriété qui ne sont pas visibles sur le type déclaré par le modèle. En ralentissant, je ferai remarquer que son type de relatif puisque l'opération de liaison prend très peu de cpu de l'application. Si vous jetiez des gabarits de contrôle à grande vitesse, vous pourriez le remarquer.

En pratique, utilisez TemplateBinding quand vous le pouvez mais ne craignez pas la liaison.


TemplateBinding - Plus contraignant que l'utilisation de liaisons régulières

  • Plus efficace qu'une reliure mais moins fonctionnelle
  • Ne fonctionne que dans l'arborescence visuelle d'un ControlTemplate
  • Ne fonctionne pas avec les propriétés sur Freezables
  • Ne fonctionne pas dans le déclencheur d'un ControlTemplate
  • Fournit un raccourci dans la définition des propriétés (pas comme verbeux), par exemple {TemplateBinding targetProperty}

Binding régulière - N'a pas les limitations ci-dessus de TemplateBinding

  • Respecte les propriétés des parents
  • Réinitialise les valeurs cibles pour effacer toutes les valeurs définies explicitement
  • Exemple: <Ellipse Fill = "{Liative RelativeSource = {RelativeSource TemplatedParent}, Chemin = Arrière-plan}" />




templatebinding