我最近一直在使用Silverlight 4的MVVM light工具包。
我非常喜欢包含的EventToCommand行为,它让生活变得更轻松。我一直想知道的一件事是,设置PassEventArgsToCommand="True"
是不好的做法,因为它会将特定的RelayCommand绑定到视图中的特定事件。
E.g。如果我的RelayCommand定义为:
public RelayCommand<System.Windows.Input.KeyEventArgs> myCommand
然后只能通过KeyUp,KeyDown等事件来调用它。
我认为ViewModel没有UI知识(例如暴露一个布尔转换器并使用转换器将其更改为可见性),PassEventArgsToCommand不会破坏它吗?
答案 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