通过MouseBinding将鼠标事件与ViewModel连接

时间:2012-02-29 10:00:53

标签: c# wpf xaml command icommand

我有一个用户控件,里面有一些telerik控件。我有一个编码的视图模型,其中所有业务逻辑都驻留在其中。我需要截取Leftbuttondown事件以了解用户何时单击telerik控件。我尝试使用MouseBinding技术将Leftbuttondown绑定到viewmodel中的事件处理程序。我不确定事件处理程序的签名是什么。我从某处读到,绑定命令应该是tyepe ICommand,而Execute方法只需要一个参数。 Leftbuttondown事件的签名就像

 public void SelectItem(object o, EventArgs e)

如何将额外参数传递给Execute?

我在xaml中完成了以下编码

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

我应该如何在ViewModel中定义SelectedItem?

会给Command =“SelectedItem”吗?或者我应该在这里添加Binding子句吗?

提前致谢

3 个答案:

答案 0 :(得分:3)

首先,您需要某种实现System.Windows.Input.ICommand的RelayCommand。这将帮助您进行绑定。

XAML

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

视图模型

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

答案 1 :(得分:2)

问题是MouseBinding的Command属性不是DependencyProperty,所​​以你不能绑定它。

请点击此处查看类似问题:

If we can't bind a MouseBinding's Command, what are we supposed to do?

基本上,根据该问题的接受答案,您必须使用AttachedCommandBehavior而不是MouseBinding来实现您想要的效果。在我看来,如果这是你做了很多的事情,这将是最好的方式。

或者,如果这是你的代码中唯一一个你正在这样做的情况,我认为在后面的代码中处理事件并从那里调用视图模型的命令不会有害。 MVVM纯粹主义者可能不同意,但有时最好以简单的方式做事,而不是将自己绑在一起试图让你的代码完全变空!

答案 2 :(得分:1)

Command值应该是绑定,而不仅仅是属性名称:

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

然后,无论你传递给CommandParameter,都将是传递给Execute的额外参数。