2011-10-13 25 views
16

Ho uno stile e desidero associare un comando allo EventSetter di Handler con RelativeSource. Il comando è in viewModel.gestore di eventi wpf binding in stile

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

Il problema è che ho un errore, perché qualcosa è sbagliato in questo (forse non è possibile farlo in modo facile)

Googled molto prima, e ho trovato il AttachedCommandBehaviour, ma penso che non funzioni con lo stile.

Potresti dare qualche suggerimento su come risolvere questo problema?

Aggiornamento 13/10/2011

ho trovato questo nel programma EventToCommand esempio MVVM Luce 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> 

Ma qui, il legame non è nello stile. Come posso inserire questo EventToCommand nello stile del pulsante?

risposta

21

In questo momento si sono vincolanti il ​​MouseLeftButtonDown eventi per TextBlock.TextBlockMouseLeftButtonDownCommand. TextBlockMouseLeftButtonDownCommand non è una proprietà valida per un TextBlock, né sembra un gestore di eventi.

Io uso lo AttachedCommandBehavior per tutto il tempo in stili per collegare un comando a un evento. La sintassi di solito si presenta così (si noti l'DataContext nel Comando Binding):

<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> 

L'alternativa è quella di agganciare l'EventSetter fino a un evento nel code-behind, ed elaborare il comando da lì:

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

gestore di eventi in codice dietro ...

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

Bella idea di mettere l'esecuzione del comando all'evento, ma proverò l'AttachCommandBehavior domani! Grazie mille per la risposta! –

+0

AttachCommandBehavior funziona perfettamente. Una cosa che non so come risolvere. Voglio legare i comandi non solo per un evento, e ho trovato questo tipo di soluzione: http://stackoverflow.com/questions/926451/how-can-i-attach-two-attached-behaviors-to-one- xaml-element È davvero buono, ma come posso mettere questo CommandBehaviorCollection allo stile? Grazie in anticipo per la risposta! –

+0

@ ZoltánBarna Sembra non funzionare in Stili o Modelli – Rachel

0

My answer sul this question fa il trucco senza alcun kit di strumenti/librerie esterne. Tuttavia, non utilizza RelativeSource e non è MVVM al 100%. Richiede una riga di codice in un gestore di eventi code-behind.