2010-10-08 3 views
7

J'ai un contrôle utilisateur qui héberge d'autres contrôles. La façon dont j'ai mis en œuvre ceci est via des modèles de données qui définissent le contrôle qui doit être associé à un modèle de vue spécifique. Ces vues-modèles ont des propriétés similaires et des déclencheurs d'interaction. Veuillez consulter l'extrait XAML ci-dessous.Est-il possible de consolider des liaisons de données et/ou des déclencheurs similaires dans XAML?

Le problème avec cette approche est que je devrais copier-coller les liaisons de données si je veux supporter un nouveau view-model. Existe-t-il un moyen de consolider toutes les liaisons de données et/ou déclencheurs similaires dans un modèle? Je ne veux pas taper/copier-coller les mêmes définitions de liaison de données dans chaque contrôle. (Oui, je sais, je suis ce paresseux.)

<UserControl.Resources> 
    <DataTemplate DataType="{x:Type vm:SomeViewModel1}"> 
     <TextBlock Canvas.Left="{Binding Left}" 
        Canvas.Top="{Binding Top}" 
        RenderTransform="{Binding Transform}" 
        Height="{Binding Height}" 
        Width="{Binding Width}"> 
      <i:Interaction.Triggers> 
       <i:EventTrigger EventName="MouseEnter"> 
        <cmd:EventToCommand Command="{Binding MouseEnterCommand}"/> 
       </i:EventTrigger> 
       <i:EventTrigger EventName="MouseLeave"> 
        <cmd:EventToCommand Command="{Binding MouseLeaveCommand}"/> 
       </i:EventTrigger> 
      </i:Interaction.Triggers> 
     </TextBlock> 
    </DataTemplate> 

    <DataTemplate DataType="{x:Type vm:SomeViewModel2}"> 
     <Rectangle Canvas.Left="{Binding Left}" 
        Canvas.Top="{Binding Top}" 
        RenderTransform="{Binding Transform}" 
        Height="{Binding Height}" 
        Width="{Binding Width}"> 
      <i:Interaction.Triggers> 
       <i:EventTrigger EventName="MouseEnter"> 
        <cmd:EventToCommand Command="{Binding MouseEnterCommand}"/> 
       </i:EventTrigger> 
       <i:EventTrigger EventName="MouseLeave"> 
        <cmd:EventToCommand Command="{Binding MouseLeaveCommand}"/> 
       </i:EventTrigger> 
      </i:Interaction.Triggers> 
     </Rectangle> 
    </DataTemplate> 

    <DataTemplate DataType="{x:Type vm:SomeViewModel3}"> 
     <Button Canvas.Left="{Binding Left}" 
       Canvas.Top="{Binding Top}" 
       RenderTransform="{Binding Transform}" 
       Height="{Binding Height}" 
       Width="{Binding Width}"> 
      <i:Interaction.Triggers> 
       <i:EventTrigger EventName="MouseEnter"> 
        <cmd:EventToCommand Command="{Binding MouseEnterCommand}"/> 
       </i:EventTrigger> 
       <i:EventTrigger EventName="MouseLeave"> 
        <cmd:EventToCommand Command="{Binding MouseLeaveCommand}"/> 
       </i:EventTrigger> 
      </i:Interaction.Triggers> 
     </Button> 
    </DataTemplate> 

    <DataTemplate DataType="{x:Type vm:SomeViewModel4}"> 
     <!-- Do not want copy-paste code here... --> 
    </DataTemplate> 
</UserControl.Resources> 
+0

Veuillez vérifier ce lien. http://stackoverflow.com/questions/1665267/datatemplate-datatypecollectionentity –

+0

Veuillez vérifier ce lien. http://stackoverflow.com/questions/1665267/datatemplate-datatypecollectionentity –

+0

Je pense que c'est pour un problème tout à fait différent. C'est pour une liste d'articles. Mon problème est de traiter des objets de traits similaires. –

Répondre

1

Vous pouvez utiliser un style commun, et mettre à la fois vos propriétés et vos triggers (qui sont également des propriétés) dans ce style, regardez ce StackOverflow question pour plus de détails.

+0

Je pense que vous avez raison. Bien que je ne sache toujours pas comment faire cela en détail, au moins je connais maintenant la direction générale. Merci. –

0

Qu'en est-il de mettre les déclencheurs dans une ressource et de les associer à vos contrôles. Ou utilisez une classe de base personnalisée pour vos DataTemplates.

+0

Je ne suis pas vraiment un expert en XAML. Avez-vous un extrait de code disponible pour illustrer cela? –

Questions connexes