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

时间:2010-06-22 08:30:05

标签: wpf events mvvm mouse command

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

两种方式实际上都是单向:

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>

和Blend interactivity.dll与行为

<i:Interaction.Triggers>
  <i:EventTrigger EventName=”MouseLeftButtonDown”>
    <Behaviours:ExecuteCommandAction Command=”{Binding MyCommand}” CommandParameter=”{Binding MyCommandParameter}”/>
  </i:EventTrigger>
</i:Interaction.Triggers>

你知道更好的方法吗?

  

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

3 个答案:

答案 0 :(得分:7)

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

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

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

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

答案 1 :(得分:6)

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

WPF Application Framework (WAF) ViewModel 示例应用程序展示了它的工作原理。

答案 2 :(得分:1)

XCommand开源codeplex项目有更好的方法来处理这个基于事件的Command / CommandParameter绑定。在这里找到xcommand.codeplex.com

以下是示例代码:

<Grid>
    <TextBlock Margin="20,30,20,0" VerticalAlignment="Top" Height="80" x:Name="XTextBlock"
           Foreground="{Binding FgColor, Mode=TwoWay}"
           XCmd:MouseMove.Command="{Binding TextBlockPointerMovedCommand}"
           XCmd:MouseLeftButtonDown.Command="{Binding TextBlockPointerPressedCommand}"
           XCmd:MouseLeave.Command="{Binding TextBlockPointerExitedCommand}"    
           Text="{Binding Description, Mode=TwoWay}">
    </TextBlock>
    <Grid Grid.Column="1" Background="{Binding BgColor, Mode=TwoWay}"
          XCmd:MouseMove.Command="{Binding GridPointerMovedCommand}" 
          XCmd:MouseMove.CommandParameter="{Binding ElementName=XTextBlock, Path=Text}"
          XCmd:MouseLeftButtonDown.Command="{Binding GridPointerPressedCommand}"
          XCmd:MouseLeftButtonDown.CommandParameter="{Binding ElementName=XTextBlock, Path=Text}"
          >
    </Grid>
</Grid>

希望这会有所帮助。