没有命令的 MVVM

Posted

技术标签:

【中文标题】没有命令的 MVVM【英文标题】:MVVM without commands 【发布时间】:2016-07-08 15:58:03 【问题描述】:

我正在学习 Silverlight/MVVM。现在我面临着命令的问题,我认为这过于复杂了。我想在命令后关闭子窗口。 据我了解,根据关注点的分离,它应该从视图中执行。 就我寻找解决方案而言,我找到了它,对于这样一个微不足道的任务来说,这并不是微不足道的。

综上所述,我必须说视图、视图模型和模型的分离是很好的想法。 从 View 到 ViewModel 的绑定也很干净。 但是命令呢?据我了解,它们只是要执行的一段代码(如委托)。但是它们太复杂和麻烦了。

我想知道你的意见。 VieModel 将具有属性和普通公共方法的想法怎么样,它将从视图事件中执行。如果我不将任何与视图相关的元素传递给视图模型,它仍然是 MVVM,对吧?

当然,会有一个缺点,我必须将 IsEnabled 单独绑定到 ViewModel 中的属性以模仿命令的 CanUpdate 功能。不是你view不知道ViewModel。 视图不太可测试,是吗?

它会非常灵活。例如,在点击事件中,我会做一些严格的视图逻辑,从 viewmodel 对象调用方法,然后可能调用另一个方法,然后再做一些视图逻辑。

那么,你怎么看?

【问题讨论】:

呵呵,我是不是从一些 MVVM/XAML 纯粹主义者那里得到了减分,甚至考虑不做唯一正确的方法? 【参考方案1】:

您可以尝试使用 Cailburn.Micro。它是一个在 WPF 上运行并隐藏了一些复杂性的开源框架。例如,它用简单的方法调用替换命令类。

您可以通过返回一个将实际关闭视图的特殊结果来实现窗口关闭。这样,您的 ViewModel 仍然是完全可单元测试的,因为您可以检查是否返回了预期的结果,并且它不会是视图感知的。

这是一个如何实现的示例:https://***.com/a/10175228/258737

【讨论】:

使用漂亮的框架似乎没问题,但我想知道我是否必须实现框架来做像打开子窗口这样简单的事情。有没有native方式?

以上是关于没有命令的 MVVM的主要内容,如果未能解决你的问题,请参考以下文章

WPF自学入门WPF MVVM模式Command命令

正确的 MVVM 模式 WPF 命令实现

MVVM 疯狂:命令

MVVM 路由和中继命令

MVVM基本基础

MVVM基本基础