web-dev-qa-db-fra.com

WPF TemplateBinding vs RelativeSource TemplatedParent

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>

?

162
PaN1C_Showt1Me

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

Les TemplateBindings sont évalués lors 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. Fouillez juste 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 son exécution soit plus lente, 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 c'est un peu relatif depuis l'opération de liaison qui prend très peu de ressources processeur de l'application. Si vous utilisiez des modèles de contrôle à grande vitesse, vous le remarquerez peut-être.

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

198
Grant BlahaErath

TemplateBinding - Plus restrictif que l'utilisation d'une liaison normale

  • Plus efficace qu'un Binding mais moins fonctionnel
  • 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 détaillé), par exemple. {TemplateBinding targetProperty}

Regular Binding - N'a pas les limitations ci-dessus de TemplateBinding

  • Respecte les propriétés des parents
  • Réinitialise les valeurs cibles pour effacer les valeurs explicitement définies
  • Exemple: <Ellipse Fill = "{Liating RelativeSource = {RelativeSource TemplatedParent}, Path = Background}" />
32
Paul Fischer

Encore une chose - TemplateBindings ne permet pas la conversion de valeur. Ils ne vous permettent pas de passer un convertisseur et ne convertissent pas automatiquement int en chaîne par exemple (ce qui est normal pour une liaison).

19

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

16
Nir

RelativeSource TemplatedParent

Ce mode permet d'associer une propriété ControlTemplate donnée à une propriété du contrôle auquel le ControlTemplate est appliqué. Pour bien comprendre le problème, voici 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, je peux utiliser le mode TemplatedParent. Il existe également une extension similaire à cette extension de balisage, TemplateBinding, qui est une sorte de raccourci de la première, mais TemplateBinding est évaluée lors de la compilation, contrairement à TemplatedParent, qui est évalué juste après la première exécution. Comme vous pouvez le constater dans l'illustration ci-dessous, l'arrière-plan et le contenu sont appliqués depuis le bouton vers le modèle de contrôle.

3

Je pensais que TemplateBinding ne supportait pas les types Freezable (qui incluent les objets pinceaux). Pour contourner le problème. On peut utiliser TemplatedParent

1
Yaz

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

0
David Rogers