在编写MVVM图形应用程序时,很有可能尝试将所需的所有事件发送到视图模型.但是在命令中处理特定于视图的鼠标事件args与MVVM原则和松散耦合的目标相反.
解决此问题的方法是将操作抽象为视图可以执行的任务,然后通过操作和数据将其结果传递回视图模型.如果你想在代码隐藏中执行少量代码来支持这一点,MVVM警察将不会带你的孩子.但更好的方法是通过行为添加交互性.行为是可重用的功能,没有代码隐藏,可以很好地适应MVVM模式和需要交互性的应用程序,否则需要向XAML添加事件处理程序.
请参阅此处的答案,以获取使用鼠标事件拖动图形对象的行为的完整示例:
通过视图执行交互,视图模型可以坚持使用数据和命令.
这适用于 Silverlight,因此它应该适用于 WPF(或者至少应该进行一些小的修改)
<i:Interaction.Triggers>
<i:EventTrigger EventName="MouseLeftButtonDown">
<cmd:EventToCommand Command="{Binding MouseCommand, PassEventArgsToCommand="True", CommandParameter="{Binding}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
Run Code Online (Sandbox Code Playgroud)