Comment créer des contrôles avec des modèles
Liaison de données
Lorsque vous créez un modèle de contrôle et que vous souhaitez lier au parent modélisé, vous pouvez utiliser :
<TextBlock Name="tb" Text="{TemplateBinding Caption}"/>
<!-- Qui est la même chose que : -->
<TextBlock Name="tb" Text="{Binding Caption, RelativeSource={RelativeSource TemplatedParent}}"/>
Bien que les deux syntaxes montrées ici soient équivalentes dans la plupart des cas, il existe quelques différences :
-
TemplateBindingn'accepte qu'une seule propriété plutôt qu'un chemin de propriété, donc si vous souhaitez lier en utilisant un chemin de propriété, vous devez utiliser la deuxième syntaxe :<!-- Cela ne fonctionnera PAS car TemplateBinding n'accepte que des propriétés uniques -->
<TextBlock Name="tb" Text="{TemplateBinding Caption.Length}"/>
<!-- Au lieu de cela, cette syntaxe doit être utilisée dans ce cas -->
<TextBlock Name="tb" Text="{Binding Caption.Length, RelativeSource={RelativeSource TemplatedParent}}"/> -
Un
TemplateBindingne prend en charge que le modeOneWaypour des raisons de performance (c'est le même que WPF). Cela signifie qu'unTemplateBindingest en réalité équivalent à{Binding RelativeSource={RelativeSource TemplatedParent}, Mode=OneWay}. Si un bindingTwoWayest nécessaire dans un modèle de contrôle, la syntaxe complète est requise comme indiqué ci-dessous. Notez queBindingutilisera également le mode de liaison par défaut contrairement àTemplateBinding.{Binding RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay} -
TemplateBindingne peut être utilisé que surIStyledElement.
<!-- Cela ne fonctionnera PAS car GeometryDrawing n'est pas un IStyledElement. -->
<GeometryDrawing Brush="{TemplateBinding Foreground}"/>
<!-- Au lieu de cela, cette syntaxe doit être utilisée dans ce cas. -->
<GeometryDrawing Brush="{Binding Foreground, RelativeSource={RelativeSource TemplatedParent}}"/>