2010-10-08 10 views
7

Tengo un control de usuario que aloja otros controles. La forma en que implementé esto es a través de plantillas de datos que definen el control que debería estar asociado con un modelo de vista específico. Estos modelos de vista tienen propiedades similares y desencadenantes de interacción. Por favor, vea el fragmento de XAML a continuación.¿Hay alguna forma de consolidar enlaces de datos y/o disparadores similares en XAML?

El problema con este enfoque es que tendría que copiar y pegar los enlaces de datos si deseo admitir un nuevo modelo de vista. ¿Hay alguna manera de consolidar todos los enlaces de datos y/o disparadores similares en una plantilla? No quiero escribir/copiar y pegar las mismas definiciones de enlace de datos en cada control. (Sí, lo sé, soy así de perezoso.)

<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

Por favor, consulte este enlace. http://stackoverflow.com/questions/1665267/datatemplate-datatypecollectionentity –

+0

Por favor, consulte este enlace. http://stackoverflow.com/questions/1665267/datatemplate-datatypecollectionentity –

+0

Creo que eso es para un problema completamente diferente. Eso es para una lista de artículos. Mi problema es tratar con objetos de rasgos similares. –

Respuesta

1

Puede usar el estilo común y poner sus propiedades y factores desencadenantes (que también son propiedades) dentro de este estilo; mire este StackOverflow question para obtener más detalles.

+0

Creo que estás en lo cierto. Aunque todavía no sé cómo hacerlo en detalle, al menos ahora sé la dirección general. Gracias. –

0

¿Qué hay de poner los disparadores en un recurso y asociándolos con sus controles. O use una clase base personalizada para sus plantillas de datos.

+0

No soy realmente un experto en XAML. ¿Tiene algún fragmento de código disponible para ilustrar eso? –

Cuestiones relacionadas