2010-10-08 13 views
7

Ho un controllo utente che ospita altri controlli. Il modo in cui l'ho implementato è tramite modelli di dati che definiscono il controllo che dovrebbe essere associato a uno specifico modello di visualizzazione. Questi modelli di vista hanno proprietà e trigger di interazione simili. Si prega di consultare lo snippet XAML di seguito.Esiste comunque il consolidamento di associazioni e/o trigger di dati simili in XAML?

Il problema con questo approccio è che dovrei copiare e incollare i binding di dati se voglio supportare un nuovo modello di vista. Esiste un modo per consolidare tutti i collegamenti e/o i trigger di dati simili in un modello? Non voglio digitare/copiare e incollare le stesse definizioni di binding dei dati in ogni controllo. (Sì, lo so, sono così pigro.)

<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

Si prega di controllare questo link. http://stackoverflow.com/questions/1665267/datatemplate-datatypecollectionentity –

+0

Si prega di controllare questo link. http://stackoverflow.com/questions/1665267/datatemplate-datatypecollectionentity –

+0

Penso che sia per un problema completamente diverso. Questo è per un elenco di elementi. Il mio problema riguarda oggetti di tratti simili. –

risposta

1

Puoi usare lo stile comune e inserire sia le proprietà che i trigger (che sono anche proprietà) all'interno di questo stile, guarda questo StackOverflow question per maggiori dettagli.

+0

Penso che tu abbia ragione. Anche se ancora non so come farlo in dettaglio, almeno ora conosco la direzione generale. Grazie. –

0

Che dire mettere i trigger in una risorsa e associarli ai controlli. Oppure usa una classe base personalizzata per i tuoi DataTemplates.

+0

Non sono un vero esperto in XAML. Avete a disposizione uno snippet di codice per illustrarlo? –

Problemi correlati