EventToCommand传递EventArgs是不是很糟糕?

时间:2010-10-21 10:32:38

标签: silverlight mvvm silverlight-4.0 mvvm-light

我最近一直在使用Silverlight 4的MVVM light工具包。

我非常喜欢包含的EventToCommand行为,它让生活变得更轻松。我一直想知道的一件事是,设置PassEventArgsToCommand="True"是不好的做法,因为它会将特定的RelayCommand绑定到视图中的特定事件。

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

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

然后只能通过KeyUp,KeyDown等事件来调用它。

我认为ViewModel没有UI知识(例如暴露一个布尔转换器并使用转换器将其更改为可见性),PassEventArgsToCommand不会破坏它吗?

3 个答案:

答案 0 :(得分:1)

ViewModel是视图的模型,因此您指的是视图必须具有的状态或它应该表示的数据,然后ViewModel应该处理它。

使用Visibility枚举来表示视图的哪个部分应该被视为关于视图的状态是合理的。

对于KeyEventArgs,这来自用户的操作并表示命令的某些状态,如果您需要知道按下了什么键,那么ViewModel可以合理地期望处理。

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

如果我想使用相同的ViewModel用于其他UI技术,我唯一不会使用Visibility或KeyEventArgs之类的东西。如果这是你的情况那么我会创建抽象(虽然根据我的经验,这很少见,并且通常会涉及他们自己的ViewModel)。

答案 1 :(得分:1)

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

这样做的原因是你无法在Silverlight中实例化KeyEventArgs(至少在我看不到的地方),因为KeyEventArgs在Silverlight中没有公共构造函数。

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

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

答案 2 :(得分:0)

将ViewModel与View分离的一种方法是使用“代理” - 调解两者之间的通信。我已经使用MVVMLight的Messenger类来实现具有良好结果的消息代理。

HTH,indyfromoz