Как использовать EventToCommand в ItemContainerStyle?
<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 ответа
Именно так я использую функцию 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
}
}
Лучший способ сделать это - просто использовать обычный обработчик событий, написанный в коде. При необходимости это может передать метод или команду вашей модели или модели представления.
Такие хитрости, как использование поведения EventToCommand, просто стоят вам с точки зрения более сложного XAML и довольно высокого риска утечки памяти. (Это происходит потому, что EventToCommand прослушивает событие CanExecuteChanged, даже если это не так.)