2011-10-13 8 views
16

Tengo un estilo, y quiero vincular un comando al EventSetter 's Handler con RelativeSource. El comando está en viewModel.vinculador del manejador de eventos wpf en estilo

<Style x:Key="ItemTextBlockEventSetterStyle" TargetType="{x:Type TextBlock}"> 
    <EventSetter Event="MouseLeftButtonDown" 
       Handler="{Binding TextBlockMouseLeftButtonDownCommand, 
          RelativeSource={RelativeSource Self}}"/> 
</Style> 

El problema es que me da un error, porque algo está mal con esto (tal vez no es posible hacer esto de tal manera fácil)

Googled mucho antes, y lo encontró el AttachedCommandBehaviour, pero creo que no funciona con estilo.

¿Podría dar algunos consejos sobre cómo resolver este problema?

actualización 13/10/2011

encontré esto en el programa EventToCommand ejemplo MVVM Light Toolkit:

 <Button Background="{Binding Brushes.Brush1}" 
      Margin="10" 
      Style="{StaticResource ButtonStyle}" 
      Content="Simple Command" 
      Grid.Row="1" 
      ToolTipService.ToolTip="Click to activate command"> 
     <i:Interaction.Triggers> 
      <i:EventTrigger EventName="Click"> 
       <cmd:EventToCommand Command="{Binding SimpleCommand}" /> 
      </i:EventTrigger> 
      <i:EventTrigger EventName="MouseLeave"> 
       <cmd:EventToCommand Command="{Binding ResetCommand}" /> 
      </i:EventTrigger> 
     </i:Interaction.Triggers> 
    </Button> 

Pero aquí, la unión no es en el estilo. ¿Cómo puedo poner esto EventToCommand al estilo del botón?

Respuesta

21

En este momento va a enlazar el evento MouseLeftButtonDown a TextBlock.TextBlockMouseLeftButtonDownCommand. TextBlockMouseLeftButtonDownCommand no es una propiedad válida para un TextBlock, ni suena como un controlador de eventos.

Uso el AttachedCommandBehavior todo el tiempo en estilos para conectar un comando a un evento. La sintaxis general es el siguiente (tenga en cuenta la DataContext en el Comando de unión):

<Style x:Key="ItemTextBlockEventSetterStyle" TargetType="{x:Type TextBlock}"> 
    <Setter Property="local:CommandBehavior.Event" Value="MouseLeftButtonDown" /> 
    <Setter Property="local:CommandBehavior.Command" 
      Value="{Binding DataContext.TextBlockMouseLeftButtonDownCommand, 
          RelativeSource={RelativeSource Self}}" /> 
</Style> 

La alternativa es conectar el EventSetter a un evento en el código subyacente, y procesar el comando de allí:

<Style x:Key="ItemTextBlockEventSetterStyle" TargetType="{x:Type TextBlock}"> 
    <EventSetter Event="MouseLeftButtonDown" 
       Handler="TextBlockMouseLeftButtonDown"/> 
</Style> 

controlador de eventos en el código detrás ...

void TextBlockMouseLeftButtonDown(object sender, MouseEventArgs e) 
{ 
    var tb = sender as TextBlock; 
    if (tb != null) 
    { 
     MyViewModel vm = tb.DataContext as MyViewModel; 

     if (vm != null && TextBlockMouseLeftButtonDownCommand != null 
      && TextBlockMouseLeftButtonDownCommand.CanExecute(null)) 
     { 
      vm.TextBlockMouseLeftButtonDownCommand.Execute(null) 
     } 
    } 
} 
+0

¡Es una buena idea poner la ejecución del comando en el evento, pero intentaré el AttachCommandBehavior mañana! ¡Muchas gracias por la respuesta! –

+0

AttachCommandBehavior funciona perfectamente. Una cosa que no estoy seguro de cómo resolver. Quiero vincular comandos no solo para un evento, y encontré este tipo de solución: http://stackoverflow.com/questions/926451/how-can-i-attach-two-attached-behaviors-to-one- xaml-element Es realmente bueno, pero ¿cómo puedo poner CommandBehaviorCollection en el estilo? ¡Gracias de antemano por su respuesta! –

+0

@ ZoltánBarna Parece que no funciona en Estilos o Plantillas – Rachel

0

My answer en this question hace el truco sin ningún tipo de kits de herramientas/librerías externas. Sin embargo, no usa RelativeSource, y no es 100% MVVM. Requiere una línea de código en un controlador de eventos de código subyacente.