通过鼠标绑定将鼠标事件与ViewModel连接

本文关键字:鼠标 ViewModel 事件 连接 绑定 | 更新日期: 2023-09-27 18:26:03

我有一个用户控件,其中包含一些telerik控件。

我需要截取LeftClick事件,以了解用户何时单击telerik控件。我尝试使用MouseBinding技术将LeftClick绑定到ViewModel中的事件处理程序。

我不确定事件处理程序的签名是什么。我在某个地方读到,要绑定的命令的类型应该是ICommand,execute方法只接受一个参数。

LeftClick事件的签名为:

public void SelectItem(object o, EventArgs e)

如何将额外的参数传递给execute方法?

我已经写了以下XAML:

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

我应该如何在ViewModel中定义SelectedItem

Command="SelectedItem"能工作吗?还是我应该在这里添加一个约束性条款?

通过鼠标绑定将鼠标事件与ViewModel连接

首先你需要一些实现System.Windows.Input.ICommand的RelayCommand。这将帮助你进行绑定。

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

问题是MouseBinding的Command属性不是DependencyProperty,因此无法将某些内容绑定到它。

类似问题请参见此处:

如果我们可以';t绑定鼠标绑定';指挥部,我们该怎么办?

基本上,根据这个问题的公认答案,你必须使用AttachedCommandBehavior而不是MouseBinding来实现你想要的。在我看来,如果这是你经常做的事情,那将是最好的方式。

或者,如果这是代码中唯一这样做的情况,我认为在代码背后处理事件并从那里调用视图模型的命令不会有什么坏处。MVVM纯粹主义者可能不同意,但有时最好用简单的方式来做事情,而不是把自己束缚在试图让代码完全为空的地方!

命令值应该是绑定,而不仅仅是属性名:

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

然后,无论您传递到CommandParameter中的是什么,都将是传递给Execute的额外参数。