2010-10-21 46 views
3

我最近一直在使用Silverlight 4的MVVM light工具箱。EventToCommand是否传递EventArgs不良做法?

我真的很喜欢包含EventToCommand行为,它使生活变得更容易。我一直在想的一件事是,如果设置PassEventArgsToCommand="True"是不好的做法,因为它会将特定的RelayCommand与View中的特定事件关联起来。

E.g.如果我的RelayCommand被定义为:

public RelayCommand<System.Windows.Input.KeyEventArgs> myCommand 

然后,这只能由KeyUp,KeyDown等事件调用。

我以为ViewModel是没有UI知识(例如暴露一个布尔转换器,并使用转换器将其改变为可见性),不PassEventArgsToCommand打破这个?

+2

我在这个问题上与你在那里......当它只是基于ViewModel进行某些操作时(例如按钮),命令就很好,并且很漂亮,但是当您在UI中讨论基于上下文的事件时(例如点击鼠标时的位置),这并不会引起我的注意作为一个不知道的ViewModel。 – 2011-06-08 19:51:52

回答

0

将视图模型与视图分离的一种方法是使用“代理” - 介于两者之间的通信。我已经使用MVVMLight的Messenger类来实现消息代理,并获得了很好的结果。

HTH,indyfromoz

+0

所以,你会把RelayCommand放在一个独立的类中,而不是ViewModel,并从那里调用RelayCommand? – Fermin 2010-10-21 12:03:43

1

视图模型是视图,以便在那里你指的声明,认为必须或数据应该代表则视图模型应该处理它的模型。

使用可见性枚举来表示视图的哪个部分应该被视为与视图的状态有关是合理的。

至于KeyEventArgs,它来自用户的一个动作,并表示该命令的某些状态,如果您需要知道按下了哪个键,那么ViewModel处理的合理期望。

如果您引入更多抽象和复杂性来移除此事件arg,那么您可能有将来的维护问题,前提是您可以使用此命令对其进行单元测试。

唯一我不会使用Visibility或KeyEventArgs等的时候,如果我想为其他UI技术使用相同的ViewModel。如果这是你的情况,那么我会创建抽象(尽管在我的经验中这很少见,并且通常会涉及他们自己的ViewModel)。

1

如果要单元测试ViewModel,即将要将KeyEventArgs作为参数调用的命令,将KeyEventArgs直接传递给ViewModel可能不是一个好主意。

原因是您无法在Silverlight中实例化KeyEventArgs(至少不会像我所见),因为KeyEventArgs在Silverlight中没有公共构造函数。

这意味着您无法从单元测试中传递密钥。在这种情况下,将特定键映射到视图/ XAML中的命令可能会更好,而不仅仅是使用EventDrigger作为KeyDown事件。

将此视为一个解决方案 - 它提供了一个KeyEventToCommand类,它允许您将键直接映射到XAML中的命令。 http://mvvmlight.codeplex.com/discussions/252898

+0

+1太棒了! KeyEventToCommand就是我正在寻找的... – 2011-09-12 00:24:53

相关问题