【问题标题】:Is EventToCommand passing EventArgs bad practice?EventToCommand 传递 EventArgs 是不好的做法吗?
【发布时间】:2011-04-28 12:59:38
【问题描述】:

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

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

例如如果我的 RelayCommand 定义为:

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

那么这只能由 KeyUp、KeyDown 等事件调用。

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

【问题讨论】:

  • 我在这个问题上与您同在...当它仅基于 ViewModel 执行某些操作(如按钮)时,命令很好而且花花公子,但是当您谈论基于上下文的事件时UI,就像点击鼠标时的位置一样,这并没有让我觉得是一个不知情的 ViewModel。

标签: silverlight mvvm silverlight-4.0 mvvm-light


【解决方案1】:

将 ViewModel 与 View 分离的一种方法是使用“代理” - 一种中介两者之间通信的东西。我使用 MVVMLight 的 Messenger 类实现了一个消息代理,效果很好。

HTH,indyfromoz

【讨论】:

  • 那么,您会将 RelayCommand 放在单独的类中,而不是 ViewModel 中,然后从那里调用 RelayCommand?
【解决方案2】:

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

使用 Visibility 枚举来表示应该查看视图的哪个部分是合理的,因为这与视图的状态有关。

至于 KeyEventArgs,它来自用户的操作,代表命令的某种状态,如果您需要知道按下了哪个键,那么 ViewModel 可以处理这是一个合理的期望。

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

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

【讨论】:

    【解决方案3】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2017-11-19
      • 2013-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-05
      • 2020-09-07
      相关资源
      最近更新 更多