2010-10-08 3 views
7

Ich habe ein Benutzersteuerelement, das andere Steuerelemente hostet. Die Art und Weise, wie ich dies implementiert habe, geschieht über Datenvorlagen, die das Steuerelement definieren, das einem bestimmten Ansichtsmodell zugeordnet werden soll. Diese Ansichtsmodelle haben ähnliche Eigenschaften und Interaktionsauslöser. Bitte beachten Sie das XAML-Snippet unten.Gibt es überhaupt eine Konsolidierung ähnlicher Datenbindungen und/oder Trigger in XAML?

Das Problem mit diesem Ansatz ist, dass ich die Datenbindungen kopieren und einfügen müsste, wenn ich ein neues Ansichtsmodell unterstützen möchte. Gibt es eine Möglichkeit, alle ähnlichen Datenbindungen und/oder Trigger in einer Vorlage zu konsolidieren? Ich möchte nicht die gleichen Datenbindungsdefinitionen in jedes Steuerelement eingeben/kopieren. (Ja, ich weiß, ich bin so faul.)

<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

Bitte überprüfen Sie diesen Link. http://stackoverflow.com/questions/1665267/datatemplate-datatypecollectionentity –

+0

Bitte überprüfen Sie diesen Link. http://stackoverflow.com/questions/1665267/datatemplate-datatypecollectionentity –

+0

Ich denke, das ist für ein anderes Problem insgesamt. Das ist für eine Liste von Elementen. Mein Problem ist der Umgang mit Objekten ähnlicher Eigenschaften. –

Antwort

1

Sie können gemeinsamen Stil verwenden, und legen Sie sowohl Ihre Eigenschaften und Trigger (die auch Eigenschaften sind) in diesem Stil, sehen Sie sich StackOverflow question für weitere Details.

+0

Ich denke, du hast Recht. Obwohl ich noch nicht weiß, wie ich das im Detail machen soll, kenne ich zumindest die allgemeine Richtung. Vielen Dank. –

0

Wie wäre es, die Trigger in eine Ressource zu setzen und sie mit Ihren Steuerelementen zu verknüpfen? Oder verwenden Sie eine benutzerdefinierte Basisklasse für Ihre DataTemplates.

+0

Ich bin nicht wirklich ein Experte in XAML. Haben Sie ein Code-Snippet, um das zu veranschaulichen? –

Verwandte Themen