【问题标题】:MVVM: commands vs eventhandlersMVVM:命令与事件处理程序
【发布时间】:2011-06-28 18:57:00
【问题描述】:

我知道这已经被做死了,但大多数答案都是“是的,如果你愿意,你可以使用事件处理程序代替命令”。这仍然不能解决是否需要编写复杂命令而不是仅仅在代码中连接事件处理程序以调用视图模型中的可测试方法的问题。

我不喜欢命令,因为它们会生成大量样板代码,并且与普通方法相比没有任何好处,而且其中一些(例如拖放)很难实现。

写作有什么问题:

代码隐藏:

private void Button_Click(object sender, RoutedEventArgs e)
{
    viewModel.LoadData();
}

视图模型:

public void LoadData()
{
   //....
}

这与任何命令一样可测试(如果不是更多的话)。 IMO,只要 UI 特定的东西没有泄漏到您的业务逻辑中,就真的没有必要在这样的复杂模式上浪费时间。想法?

【问题讨论】:

  • 顺便说一句,我知道至少有一个框架有一些聪明的基础设施,可以让你绑定到 LoadData() 和可选的 CanLoadData() 方法。这不是框架的插件(caliburn/caliburn.micro),我不推荐初学者使用。但是看到其他框架,我不会感到震惊,甚至可能最终 MS 也会效仿,它是一个将逻辑保存在视图模型中的插件,还有一个额外的好处是有可能迁移到这样的框架并拥有你的蛋糕也吃一些。不过,我会说,先把它收起来,然后按照命令去做。 HTH

标签: silverlight mvvm command


【解决方案1】:

写作有什么问题

什么都没有——大部分情况下。

如果您小心地将业务逻辑排除在代码隐藏文件之外,那么使用代码隐藏并没有什么问题。这是直接委托给 ViewModel,这是合理的。

话虽如此,就长期可维护性而言,这里有几个潜在的缺陷:

  1. 通过这样做,您可以更紧密地将 View 耦合到 ViewModel。虽然这是一个合理的做法(实际上,View 总是知道 ViewModel),但它确实阻止了在某些情况下对 View 组件的潜在重用,因为使用 ICommand 允许您使用相同的 View可能不同的 ViewModel。 (不过,这在实践中很少见。)
  2. 这开始了一个滑坡 - 通过将“任何”代码添加到后面的代码中,您打开了另一个开发人员将在其中添加“仅多行”的潜力。久而久之,这可能会导致混乱。
  3. 它将代码添加到另一个必须维护的地方。现在您必须维护 ViewModel .cs 文件、.xaml 文件和代码隐藏文件。
  4. 您正在将此逻辑硬连接到按钮中。如果您决定更改控件、使用手势等,则必须记住重新处理此逻辑。

【讨论】:

    【解决方案2】:

    一开始我在你的船上,我什至在这里问了same question。但我来了,真的很喜欢命令。

    有些命令本身非常复杂,需要进行测试。它们与您的视图模型上的其他任何东西一样可测试。

    ICommand 还包括CanExecuteCanExecuteChanged,这使您的视图几乎可以免费智能地启用/禁用自身。这在复杂视图中非常棒。

    命令可以更轻松地更改视图,大多数控件都有一个可以绑定的命令属性,并且简单地移动绑定比使用事件处理程序更容易。如果您有设计人员处理 XAML,则尤其如此。

    您几乎可以在视图不存在的情况下编写视图的整个逻辑。它导致了一次构建肉体的良好流程,然后一次将界面全部放在顶部。

    将您的代码保存在一个地方会带来长期的可维护性。

    【讨论】:

    • IsActive 属性的额外好处是可以在需要时完全删除控件。这使得处理角色变得更加容易。
    【解决方案3】:

    对我来说,反对事件的一个非常重要的论点是迫使 UI 设计师编写代码来测试视图。更糟糕的是:每次他重新设计视图时,他都必须重新连接事件。

    Blend 中的命令和行为使这个过程变得过时并且更容易。

    在编写事件处理程序时实际使用事件参数时可能会出现另一个问题。当您想切换到另一个控件或另一个事件时,您可能已经非常依赖事件参数,因此很难切换,因为另一个控件/事件不支持相同的事件参数。

    【讨论】:

      猜你喜欢
      • 2010-10-16
      • 1970-01-01
      • 1970-01-01
      • 2018-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多