我在这里看到一个问题,OP询问有关将事件绑定到ViewModel的问题。基本上,ViewModel将重新呈现包含Model中必要数据的抽象View,以便View也可以使用Bindings。但是为了能够满足所有ViewModel还必须转换视图中发生的大多数用例,例如如果搜索文本框为空,则搜索按钮应显示为灰色。这很好,但我们可以在游戏中添加事件。如果Button.Click可以绑定到ViewModel中的EventHandler并且在事件处理程序中,那么你就可以使用模型对象了。
现在我的问题是,因为WPF支持事件驱动编程,为什么在ViewModel中处理不能发生的事件?我怎么能提供绑定事件功能?
答案 0 :(得分:1)
事件处理程序将位于视图后面的代码文件中。如果您正在使用MVVM,那么您将希望最小化代码隐藏文件中的代码量。
WPF支持命令,ICommand界面包含CanExecute
和Execute
方法。有ICommand
的实现允许在视图模型上实现这些方法。
话虽如此,指挥也有其局限性,所以you should consider using an MVVM framework when using MVVM。像Caliburn.Micro这样的东西附带Actions,它也允许根据控件事件调用视图模型上的动词。
答案 1 :(得分:1)
这是因为事件的使用明确地打破了MVVM模式(我相信你知道)。然而,还有另外一种方法 - 使用Attached Command Behaviour pattern。更多信息here。
可以从here下载适用于附加命令的小而精彩框架的代码。
我希望这会有所帮助。
编辑。附加行为允许您在不破坏MVVM模式的情况下使用事件。用法就像
<Border Background="Yellow" Width="350" Margin="0,0,10,0" Height="35" CornerRadius="2" x:Name="test">
<local:CommandBehaviorCollection.Behaviors>
<local:BehaviorBinding Event="MouseLeftButtonDown"
Action="{Binding DoSomething}"
CommandParameter="An Action on MouseLeftButtonDown"/>
<local:BehaviorBinding Event="MouseRightButtonDown"
Command="{Binding SomeCommand}"
CommandParameter="A Command on MouseRightButtonDown"/>
</local:CommandBehaviorCollection.Behaviors>
<TextBlock Text="MouseDown on this border to execute the command"/>
</Border>