Соединение событий мыши с ViewModel через MouseBinding - PullRequest
3 голосов
/ 29 февраля 2012

У меня есть пользовательский элемент управления с некоторыми элементами управления telerik. У меня есть закодированная модель представления, в которой находится вся бизнес-логика. Мне нужно перехватить событие Leftbuttondown, чтобы узнать, когда пользователь нажимает на элемент управления telerik. Я попытался использовать технику MouseBinding, чтобы привязать левую кнопку к обработчику событий в модели представления. Я не уверен в том, что является подписью для обработчика событий. Я откуда-то читал, что команда bind должна иметь тип ICommand, а метод Execute принимает только один параметр. Подпись для события Leftbuttondown выглядит как

 public void SelectItem(object o, EventArgs e)

Как я могу передать дополнительный аргумент в Execute?

Я сделал следующее кодирование в xaml

    <telerik:RadTransitionControl.InputBindings>
        <MouseBinding Gesture="LeftClick" Command="SelectedItem" />
    </telerik:RadTransitionControl.InputBindings>

Как мне определить SelectedItem в ViewModel?

Будет ли работать команда Command = "SelectedItem"? или я должен добавить сюда обязательное условие?

Заранее спасибо

Ответы [ 3 ]

3 голосов
/ 29 февраля 2012

Во-первых, вам нужен RelayCommand , который реализует System.Windows.Input.ICommand. Это поможет вам в Binding.

XAML

<MouseBinding Gesture="LeftClick" Command="{Binding SelectedItemCommand}" />

ViewModel

class YourViewModel
{
   public void SelectItem(object o)
   {       }

   private ICommand selectedItemCommand
   public ICommand SelectedItemCommand 
   {
     get
     {
        if(selectedItemCommand == null)
        { 
          // RelayCommand will point to SelectItem() once mouse is clicked
          selectedItemCommand = new RelayCommand(SelectItem);
        }

        return selectedItemCommand;
     } 
   }
}
2 голосов
/ 29 февраля 2012

Проблема в том, что свойство Command MouseBinding не является DependencyProperty, поэтому вы не можете связать что-либо с ним.

Смотрите здесь для аналогичной проблемы:

Если мы не можем связать команду MouseBinding, что мы должны делать?

По сути, согласно принятому ответу на этот вопрос, вам придется использовать AttachedCommandBehavior, а не MouseBinding, чтобы достичь того, что вы хотите. На мой взгляд, это было бы наилучшим способом, если вы этим часто занимаетесь.

В качестве альтернативы, если это единственный случай в вашем коде, когда вы делаете это, я не думаю, что было бы вредно обрабатывать событие в коде и вызывать команду модели представления оттуда. Пуристы из MVVM могут не согласиться с этим, но иногда лучше все делать проще, чем связывать себя узами, пытаясь сохранить ваш код полностью пустым!

1 голос
/ 29 февраля 2012

Значение команды должно быть привязкой, а не просто именем свойства:

<MouseBinding Gesture="LeftClick" Command="{Binding SelectedItem}" CommandParameter="..." />

Тогда все, что вы передадите в CommandParameter, будет дополнительным аргументом, который передается в Execute.

...