2011-05-11 7 views
11

Como saben que no se puede obligar a un evento directamente a un comando sin un comportamiento:Disparar un comando dentro de EventTrigger de un estilo?

<DataGrid> 
    <i:Interaction.Triggers> 
     <i:EventTrigger EventName="PreviewMouseDoubleClick"> 
      <i:InvokeCommandAction Command="{Binding TradeEntryCommand"} /> 
     </i:EventTrigger> 
    </i:Interaction.Triggers> 
</DataGrid> 

Esto funciona perfectamente bien, sin embargo, ahora tengo que refactorizar esto desde doble clic en la cuadrícula de datos a duplicar clic en la celda . (No me importa lo que se ha hecho clic celular)

que estaba esperando para definir esta behviour ahora dentro del estilo de celda como esto:

<Style x:Key="DefaultCellStyleBase" TargetType="{x:Type DataGridCell}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type DataGridCell}"> 
       <ControlTemplate.Triggers> 
        <EventTrigger RoutedEvent="PreviewMouseDoubleClick"> 
         ????????? 
        </EventTrigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
    <!-- ... --> 
</Style> 

Pero ¿cómo iba a traer en el comportamiento de arriba para disparar el ¿mando?

altamente apreciada,

+0

Varios errores de esto ya están relacionados con la definición de comportamientos en estilos. En resumen: no se puede, al menos no sin saltar a través de MUCHOS aros de código complicados. Me encanta el comportamiento de EventToCommand, pero en casos como este siempre he tenido que recurrir a un EventSetter normal con el manejador de métodos en la vista que ejecuta el comando viewmodel. Se siente sucio, se ve feo con todas las comprobaciones nulas involucradas, pero después de haber analizado las "soluciones" de esto, probablemente sea aún más simple a menos que te encuentres con este montón de veces en una aplicación grande. –

Respuesta

7

Desde que se retemplating la DataGridCell, se podría añadir los disparadores para el elemento raíz en la plantilla de control. Algo así como:

<ControlTemplate TargetType="{x:Type DataGridCell}"> 
    <Grid x:Name="root" Background="Transparent"> 
     <i:Interaction.Triggers> 
      <i:EventTrigger EventName="PreviewMouseDoubleClick"> 
       <i:InvokeCommandAction Command="{Binding TradeEntryCommand}" /> 
      </i:EventTrigger>        
     </i:Interaction.Triggers> 
    </Grid> 
</ControlTemplate> 
+0

Mientras se crea el código, no puedo obtener el DataContext correcto, ya que se encuentra en algún lugar no especificado. Incluso intenté esto sin éxito: Houman

+1

@Kave - Probar: Command = "{Enlazar DataContext.TradeEntryCommand, RelativeSource = {RelativeSource FindAncestor, AncestorType = Vistas: MainWindow}} " – CodeNaked

2

Ésta es una versión que estoy usando para un botón al mando en una situación similar (Button en DataGridRow, Comando de cuadrícula de datos debe ser invocado por el botón y necesito el DataContext de la fila en mi mando) Tendría que usar el comando de InvokeCommandAction de doubleClick-trigger, pero supongo que debería funcionar también.

¡Buena suerte!

<DataTemplate> 
      <TextBlock>        
      <Button x:Name="cmdButton"        
            Command="{Binding Path=DataContext.CommandNameInViewModel, 
             RelativeSource={RelativeSource AncestorType={x:Type TypeOfAncestorWithTheViewModel}}}" 
            CommandParameter="{Binding}" >  
            Do something 
     </Button> 

    </TextBlock> 
</DataTemplate>  
Cuestiones relacionadas