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

bzzcjhmw  于 2023-08-01  发布在  其他
关注(0)|答案(3)|浏览(152)

我有一个用户控件,其中包含一些telerik控件。我编写了一个ViewModel,所有业务逻辑都驻留在其中。
我需要拦截LeftClick事件,以了解用户何时单击telerik控件。我尝试使用MouseBinding技术将LeftClick绑定到ViewModel中的事件处理程序。
我不确定事件处理程序的签名是什么。我在某个地方读到,绑定的命令应该是ICommand类型,执行方法只需要一个参数。
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"能用吗?或者我应该在这里加上一个约束性条款?

fcwjkofz

fcwjkofz1#

首先你需要某种实现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;
     } 
   }
}

wj8zmpe1

wj8zmpe12#

问题是MouseBinding的Command属性不是DependencyProperty,因此您无法将某些内容绑定到它。
这里有一个类似的问题:
If we can't bind a MouseBinding's Command, what are we supposed to do?
基本上,根据这个问题的公认答案,你必须使用AttachedCommandBehavior而不是MouseBinding来实现你想要的。在我看来,这将是最好的方式,如果这是你做了很多。
或者,如果这是您的代码中唯一这样做的情况,我认为在代码后面处理事件并从那里调用视图模型的命令不会有什么坏处。MVVM纯粹主义者可能不同意,但有时候最好用简单的方式做事情,而不是把自己绑在结里,试图让代码完全空着!

r7knjye2

r7knjye23#

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

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

字符串
然后你传递给CommandParameter的任何东西都将是传递给Execute的额外参数。

相关问题