我知道这已经完成了死亡,但大多数答案都是按照“是的,如果你愿意,可以使用事件处理程序代替命令”。这仍然无法解决编写复杂命令是否合理的问题,而不仅仅是在代码后面连接事件处理程序以在视图模型中调用可测试方法。
我不喜欢命令,因为它们产生了很多样板代码并且没有给我任何优于普通方法的好处,而且其中一些(例如拖放)很难实现。
写作有什么问题:
代码隐藏:
private void Button_Click(object sender, RoutedEventArgs e)
{
viewModel.LoadData();
}
视图模型:
public void LoadData()
{
//....
}
这与任何命令同样可测试(如果不是更多)。 IMO,只要UI特定的东西没有泄漏到您的业务逻辑中,就没有必要在这样复杂的模式上浪费时间。想法?
答案 0 :(得分:5)
写作有什么问题
没什么 - 大部分都是。
如果您小心地将业务逻辑保留在文件后面的代码中,那么使用代码背后没有任何问题。这是将它直接委托给ViewModel,这是合理的。
话虽如此,在长期可维护性方面存在一些潜在的弊端:
ICommand
可以让你拥有相同的View与可能不同的ViewModel一起使用。 (然而,这在实践中很少见。)答案 1 :(得分:3)
我最初在你的船上,我甚至在这里基本上问same question。但我来到这里并且非常喜欢命令。
某些命令确实非常复杂,并且它们本身也足以保证测试。它们与viewmodel上的任何其他内容一样可测试。
ICommand
还包括CanExecute
和CanExecuteChanged
,这使您的视图可以免费智能地启用/禁用自身。这在复杂的景观中非常棒。
命令可以更容易地改变你的视图,大多数控件都有一个你可以绑定的Command属性,简单地移动绑定比使用事件处理程序更容易。如果您有设计人员在使用XAML,则尤其如此。
你甚至可以在没有视图存在的情况下编写视图的整个逻辑。它可以立即生成一个很好的构建肉的流程,然后将界面全部抛到一边。
将代码保存在一个位置可以实现更长期的可维护性。
答案 2 :(得分:0)
对我而言,反对事件的一个非常重要的论点是迫使UI Designer编写代码以便能够测试View。更糟糕的是:每当他重新设计视图时,他都必须重新连接事件。
命令和Blend中的行为使得渲染过程变得过时且容易。
在编写事件处理程序时实际使用事件参数时可能会出现另一个问题。当您想要切换到另一个控件或其他事件时,您可能已经非常依赖于事件参数,因此很难切换,因为其他控件/事件不支持相同的事件参数。