MVVM:命令与事件处理程序

时间:2011-02-17 01:19:24

标签: silverlight mvvm command

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

我不喜欢命令,因为它们产生了很多样板代码并且没有给我任何优于普通方法的好处,而且其中一些(例如拖放)很难实现。

写作有什么问题:

代码隐藏:

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

视图模型:

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

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

3 个答案:

答案 0 :(得分:5)

  

写作有什么问题

没什么 - 大部分都是。

如果您小心地将业务逻辑保留在文件后面的代码中,那么使用代码背后没有任何问题。这是将它直接委托给ViewModel,这是合理的。

话虽如此,在长期可维护性方面存在一些潜在的弊端:

  1. 通过这样做,您可以更紧密地将View耦合到ViewModel。虽然这是一个合理的事情(View,实际上,总是知道ViewModel),但它确实阻止了在某些情况下可能重用View组件,因为使用ICommand可以让你拥有相同的View与可能不同的ViewModel一起使用。 (然而,这在实践中很少见。)
  2. 这开始了一个滑坡 - 通过在代码背后添加“任何”代码,你开辟了另一个开发人员将在那里添加“仅一行”的潜力。随着时间的推移,这会导致一团糟。
  3. 它将代码添加到另一个必须维护的地方。现在,您必须维护ViewModel .cs文件,.xaml文件和文件后面的代码。
  4. 你很难将这个逻辑连接到一个按钮。如果您决定更改控件,使用手势等,则必须记住重写此逻辑。

答案 1 :(得分:3)

我最初在你的船上,我甚至在这里基本上问same question。但我来到这里并且非常喜欢命令。

某些命令确实非常复杂,并且它们本身也足以保证测试。它们与viewmodel上的任何其他内容一样可测试。

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

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

你甚至可以在没有视图存在的情况下编写视图的整个逻辑。它可以立即生成一个很好的构建肉的流程,然后将界面全部抛到一边。

将代码保存在一个位置可以实现更长期的可维护性。

答案 2 :(得分:0)

对我而言,反对事件的一个非常重要的论点是迫使UI Designer编写代码以便能够测试View。更糟糕的是:每当他重新设计视图时,他都必须重新连接事件。

命令和Blend中的行为使得渲染过程变得过时且容易。

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

相关问题