Как использовать EventToCommand в ItemContainerStyle? - PullRequest
0 голосов
/ 13 января 2012
        <ListBox Grid.Row="1" ItemsSource="{Binding Source}" SelectedItem="{Binding SelectedItem,Mode=TwoWay}" DisplayMemberPath="Name">
        <ListBox.ItemContainerStyle>
            <Style>
                <EventSetter Event="ListBoxItem.MouseDoubleClick" Handler="DoubleClick" />
            </Style>
        </ListBox.ItemContainerStyle>
    </ListBox>

Вот как это работает сейчас. Что мне делать, если я хочу связать каждое событие DoubleClick объекта ListBoxItem с RelayCommand?

Ответы [ 2 ]

0 голосов
/ 13 января 2012

Так я использую функцию MVVMLight EventToCommand.

Если у вас есть событие двойного щелчка для этого. Если это недоступно, возьмите mousedown (предварительный просмотр) и проверьте clickCount в аргументах команды. ClickCount, равный 2, соответствует двойному щелчку.

Обратите внимание: у меня есть своя собственная реализация RelayCommand. Один из инструментария MVMMLight может выглядеть иначе.

XAML:

<interactivity:Interaction.Triggers>
    <interactivity:EventTrigger EventName="MouseDown">
        <mvvmLight:EventToCommand PassEventArgsToCommand="True" Command="{Binding MouseDownCommand}"></mvvmLight:EventToCommand>
    </interactivity:EventTrigger>
</interactivity:Interaction.Triggers>

ViewModel:

public ICommand MouseDownCommand
{
  get
  {
    if (_mouseDownCommand == null)
    {
      _mouseDownCommand = new RelayCommand(x => MouseDown(x as MouseButtonEventArgs));
    }
    return _mouseDownCommand;
  }
}

private void MouseDown(MouseButtonEventArgs e)
{
  if (e.ClickCount == 2)
  {
    // do stuff
  }
}
0 голосов
/ 13 января 2012

Лучший способ сделать это - просто использовать обычный обработчик событий, написанный в коде. При необходимости это может привести к методу или команде вашей модели или модели представления.

Такие хитрости, как использование поведения EventToCommand, просто стоят вам с точки зрения более сложного XAML и довольно высокого риска утечки памяти. (Это происходит потому, что EventToCommand прослушивает событие CanExecuteChanged, даже если это не так.)

...