2011-10-13 12 views
16

Mam styl i chcę powiązać polecenie z EventSetter z Handler z RelativeSource. Polecenie znajduje się w viewModel.Moduł wywołania zdarzenia wpf powiązanie stylu

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

Problemem jest to, że pojawia się błąd, że coś jest nie tak z tego (może to nie jest możliwe, aby zrobić to w taki prosty sposób)

Mam google dużo wcześniej i znalazłem the AttachedCommandBehaviour, ale myślę, że to nie działa ze stylem.

Czy możesz podać wskazówki, jak rozwiązać ten problem?

Aktualizacja 13/10/2011

Znalazłem to w EventToCommand przykład programu MVVM Toolkit światła:

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

Ale tutaj, wiązanie nie jest w stylu. Jak mogę umieścić ten EventToCommand w stylu przycisku?

Odpowiedz

21

Teraz jesteś wiązania MouseLeftButtonDown wydarzenie do TextBlock.TextBlockMouseLeftButtonDownCommand. TextBlockMouseLeftButtonDownCommand nie jest poprawną właściwością dla obiektu TextBlock, ani nie brzmi jak obiekt obsługi zdarzeń.

Używam AttachedCommandBehavior cały czas w stylach do podłączania polecenia do zdarzenia. Składnia zwykle wygląda następująco (zauważ DataContext w poleceniu 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> 

Alternatywą jest zaczepić EventSetter do zdarzenia w kodzie-za i przetwarzać polecenia stamtąd:

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

obsługi zdarzeń w kodzie za ...

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

Niezły pomysł na wykonanie polecenia wykonania zdarzenia, ale jutro spróbuję AttachCommandBehavior! Wielkie dzięki za odpowiedź! –

+0

AttachCommandBehavior działa idealnie. Jedna rzecz, której nie jestem pewien, jak rozwiązać. Chcę wiązać polecenia nie tylko w przypadku jednego zdarzenia i znalazłem takie rozwiązanie: http://stackoverflow.com/questions/926451/how-can-i-attach-two-attached-behaviors-to-one- xaml-element Jest naprawdę dobry, ale jak mogę umieścić ten CommandBehaviorCollection w stylu? Z góry dziękuję za odpowiedź! –

+0

@ ZoltánBarna Wygląda na to, że nie działa w stylach ani szablonach. – Rachel

0

My answer na this question załatwia sprawę bez żadnych zewnętrznych zestawy narzędzi/bibliotek. Jednak nie używa on RelativeSource i nie jest to 100% MVVM. Wymaga to jednego wiersza kodu w procedurze obsługi zdarzeń z kodem.