Question

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>

Était-ce utile?

La solution

TemplateBinding est pas tout à fait la même chose. documentation MSDN sont souvent écrits par des gens qui doivent interroger monosyllabiques sur les fonctionnalités du SDE logiciel, de sorte que les nuances ne sont pas tout à fait raison.

TemplateBindings sont évaluées au moment de la compilation par rapport au type spécifié dans le modèle de commande. Cela permet instanciation beaucoup plus rapide des modèles compilés. Il suffit de tâtonner le nom dans un TemplateBinding et vous verrez que le compilateur le signaler.

Le balisage de liaison est résolu lors de l'exécution. Bien que plus lente à exécuter, la liaison résoudra les noms de propriétés qui ne sont pas visibles sur le type déclaré par le modèle. En plus lent, je vais souligner que ce genre de rapport depuis l'opération de liaison prend très peu de cpu de l'application. Si vous modèles de contrôle dynamitage autour à grande vitesse que vous pourriez remarquer.

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

Autres conseils

TemplateBinding - Plus restrictif que l'utilisation régulière de liaison

  • Plus efficace qu'une liaison mais il a moins de fonctionnalités
  • fonctionne seulement à l'intérieur d'un arbre visuel ControlTemplate
  • Ne fonctionne pas avec des propriétés sur Freezables
  • Ne fonctionne pas dans Trigger
  • d'un ControlTemplate
  • Fournit un raccourci dans la définition des propriétés (pas bavard), par exemple. {} TemplateBinding TargetProperty

normal Reliure - N'a pas au-dessus des limites de TemplateBinding

  • Respecte propriétés parent
  • Valeurs cibles réinitialisations pour effacer des valeurs définies explicitement
  • Exemple:

Une chose - TemplateBindings ne permettent pas de valeur de conversion. Ils ne convertissez vous permettent pas de passer un convertisseur et ne pas automatiquement int à chaîne par exemple (ce qui est normal pour une liaison).

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

RelativeSource TemplatedParent

Ce mode permet lier une propriété ControlTemplate donnée à une propriété du contrôle que le ControlTemplate est appliqué. Pour bien comprendre la question ici est un exemple ci-dessous

<Window.Resources>
    <ControlTemplate x:Key="template">
        <Canvas>
            <Canvas.RenderTransform>
                <RotateTransform Angle="20"/>
            </Canvas.RenderTransform>
            <Ellipse Height="100" Width="150" 
                     Fill="{Binding 
                RelativeSource={RelativeSource TemplatedParent},
                Path=Background}">

            </Ellipse>
            <ContentPresenter Margin="35" 
                      Content="{Binding RelativeSource={RelativeSource  
                      TemplatedParent},Path=Content}"/>
        </Canvas>
    </ControlTemplate>
</Window.Resources>

<Canvas Name="Parent0">
    <Button   Margin="50" 
              Template="{StaticResource template}" Height="0" 
              Canvas.Left="0" Canvas.Top="0" Width="0">
        <TextBlock FontSize="22">Click me</TextBlock>
    </Button>
</Canvas>

Si je veux appliquer les propriétés d'un contrôle donné à son modèle de contrôle alors je peux utiliser le mode TemplatedParent. Il y a aussi un semblable à cette extension de balisage qui est le TemplateBinding qui est une sorte de sténographie de la première, mais la TemplateBinding est évaluée au moment de la compilation au contraste de l'TemplatedParent qui est évaluée juste après la première exécution. Comme vous pouvez le remarquer dans la figure ci-dessous, l'arrière-plan et le contenu sont appliqués à partir du bouton pour le modèle de contrôle.

Je pensais que TemplateBinding ne supporte pas les types Freezable (qui comprend des objets de pinceau). Pour contourner le problème. On peut utiliser TemplatedParent

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top