使用MVVM模式处理控件上的鼠标事件 - 最佳实践 -

msf*_*boy 5 wpf mouse events command mvvm

我发现实际上有两种方法可以使用mvvm模式处理控件上的鼠标事件.

两种方式实际上都是1种方式:

MVVM Light Toolkit http://mvvmlight.codeplex.com/

<i:Interaction.Triggers>
    <i:EventTrigger EventName="SelectionChanged">
        <cmd:EventToCommand
            Command="{Binding SelectionChangedCommand}"
            CommandParameter="{Binding SelectedItems,
                ElementName=MyDataGrid}" />
    </i:EventTrigger>
</i:Interaction.Triggers>
Run Code Online (Sandbox Code Playgroud)

和Blend interactivity.dll与行为

<i:Interaction.Triggers>
  <i:EventTrigger EventName=”MouseLeftButtonDown”>
    <Behaviours:ExecuteCommandAction Command=”{Binding MyCommand}” CommandParameter=”{Binding MyCommandParameter}”/>
  </i:EventTrigger>
</i:Interaction.Triggers>
Run Code Online (Sandbox Code Playgroud)

你知道更好的方法吗?

主持人:为什么我的最后6个xaml代码行根本不可见?它们被IE和Iron浏览器吞噬.您能否报告管理员修复该代码脚本?它经常不起作用.证明:http://img251.imageshack.us/img251/5236/errorxt.png

Ray*_*rns 7

如果你需要在任意位置处理MouseDown,这些都是很好的方法.

然而,这些情况通常很少而且很远.通常有一种更简单的方法:

  • 你确定你的对象不是真的按钮看起来不像按钮吗?如果是这样,请将它们设置为真实的Button对象并将它们模板化为您想要的样子.
  • 您确定您的对象只是列表中对象的选择区域吗?如果是这样,将容器从ItemsControl更改为ListBox并重新设置ListBoxItem以使用选择区域.
  • 您的对象是否正在被选中的图形路径?使用ToggleButton,其内容是路径本身.

还有许多其他例子.实际上,很少发现MouseDown映射到Command的情况,并且没有更简洁的方法来执行相同的操作.


jbe*_*jbe 6

总有另一种选择.您可以在View的代码隐藏中处理WPF事件,并在ViewModel上调用适当的方法.MVVM模式不禁止在View的代码隐藏文件中编写任何代码.

WPF应用程序框架(WAF)ViewModel示例应用程序显示了它的工作原理.