2012-09-04 61 views
3

我试图理解这个概念,它躲过了我。MouseDown,PreviewMouseDown等...和MVVM中的命令绑定

这背后的一般概念是什么?我知道这是可能的,但我并不完全遵循我的研究/自己的测试项目如何做到这一点。

我想避免代码在我的观点不惜代价。我想从视图中分离出诸如“PreviewMouseDown”之类的事件,并让它们在ViewModel中触发一个Command。

任何人都可以给我一些基本的指导,如何做到这一点?

摘要:

视图(PreviewMouseDown) - >调用命令在视图模型(MyPreviewMouseDownCommand)

谢谢

+2

守法并不是一件可怕的罪。一些任务通过代码隐藏很容易解决。 MVVM模式的主要思想是不允许VM对View有更多的了解。和View一模一样。如果你只在视图中隐藏工作 - 没关系。即使它依赖于虚拟机 - 它仍然可以。 –

回答

3

最糟糕的事情这是所有关于CommandingBinding风险。但我会鼓励你更好地使用一个为你提供管道的框架。如果你想要查看第一个策略,你可以使用MVVM Light作为Reed建议。但是,如果你想要ViewModel的第一种方法(我发现个人更容易理解),那么我建议你使用Caliburn Micro

无论如何,如果您想要保持代码清洁,最终将使用Event to Command或Interactivity Library(来自Blend SDK)。

+0

谢谢大家的宝贵意见。 – tronious

4

这是通过某种形式的Attached Property(Blend) Behavior通常处理。

例如,MVVM Light包含一个EventToCommand Behavior,它允许您将任何事件路由到XAML中的ICommand,而不添加任何代码。

+1

另一种选择是使用Blend SDK的EventTrigger和InvokeCommandAction。这与EventToCommand的不利之处在于,InvokeCommandAction不允许将事件参数作为参数传递给命令。 – Thelonias

11

在被downvoted我不认为这是世界

public void PreviewMouseDown(Object sender, RoutedEventArgs e) 
{ 
    var viewModel= (MyViewModel)DataContext; 
    if (viewModel.MyCommand.CanExecute(null)) 
     viewModel.MyCommand.Execute(null); 
}