8

我刚刚阅读了这篇关于 MVMC 模式的文章。现在我有一个问题。Controller应该注入ViewModel,还是ViewModel应该注入Controller?

4

4 回答 4

9

MVMC 只是一个 MVC,其中 View 被 ViewModel 对替换。

  • View 仅与 ViewModel 交互,利用基于 XAML 的技术中强大的数据绑定机制。
  • ViewModel 可以通知控制器,但绝不应该注入控制器。

我根据 MSDN 上众所周知的 Josh Smith 示例整理了一个简单的示例……我在其中介绍了一个控制器。

于 2013-06-18T19:59:55.620 回答
5

这取决于你在做什么。我猜测大多数时候控制器都不需要注入其中,但如果需要,则更有可能在 ViewModel 中需要它。让我解释。

你用控制器做什么?您必须在做某事。如果该“某事”仅与“数据的样子”相关,那么它属于视图。如果它与“正在向用户显示的内容”相关,那么它属于 ViewModel。

我将一个控制器注入到我的一个 ViewModel 中。我的 ViewModel 表示数据,然后在视图中绘制图形。我有一个命令将数据项从当前图表移动到新图表。由于这改变了“图形窗口中显示的内容”,我在 ViewModel 中实现了该命令。ViewModel 从它自己的项目集合中移除数据项,然后使用控制器请求为该新数据创建一个新视图(它已经具有此功能)。

查看文章,我没有看到控制器和视图之间的箭头 从您链接的文章中

于 2012-10-12T04:50:30.820 回答
0

ViewModel 是 View 和 Controller 之间的契约,理想情况下也不需要知道(依赖)。

所以我绝对不会将控制器注入到 ViewModel 中。

我也不确定我是否会做相反的事情:控制器通常负责创建新的 ViewModel 实例。如果你想要一个更松耦合的实现,你可以将一个抽象工厂注入到 Controller 中,以避免直接创建 ViewModel 类的新实例。

于 2012-10-11T14:12:23.997 回答
0

我认为 Controller应该作为抽象 IController 注入。ViewModel 需要 IController 才能导航到不同的 View/ViewModel。

例如,在 ViewModel 中:

IController _controller;

public MyViewModel(IController controller){
  _controller = controller;
}

void NavigateHome();
{
  _controller.NavigateHome();
}

由于以下原因,抽象 IController 比注入 Controller 本身要好:

  1. 可测试性。您可以注入一个模拟 IController 并测试 ViewModel
  2. 脱钩。ViewModel 不必知道 Controller。

我开发了一个轻量级框架,用于在 WPF 中执行 MVMC。它与 Asp.NET Core 中的 MVC 有很多相似之处。

如果您正在寻找 WPF 解决方案,请查看它。

带有文档的博客文章:http: //michaelscodingspot.com/2017/02/15/wpf-page-navigation-like-mvc-part-2-mvvmc-framework/

GitHub: https ://github.com/michaelscodingspot/WPF_MVVMC

于 2017-02-16T11:55:00.320 回答