我发现实际上有两种方法可以使用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
答案 0 :(得分:7)
如果您需要在任意位置处理MouseDown,这些都是很好的方法。
然而,这些情况通常很少见。通常有一种更简单的方法:
还有很多其他例子。实际上,很少发现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>
希望这会有所帮助。