一个模型应该如何传递给视图模型?

7
在 MVVM 设计中,如果 View 创建了 ViewModel,ViewModel 该如何知道它的 Model 呢?
我从一些地方了解到,Model 可以通过其构造函数传递到 ViewModel 中。所以它看起来像这样:
class ViewModel {
   private Model _model;
   public ViewModel(Model model) {
      _model = model;
   }
}

由于View创建ViewModel并将Model传入ViewModel的构造函数,因此View必须知道Model的存在。但是从我看到的大多数MVVM设计的UML图中,View似乎对Model一无所知。
那么如何将Model传递给ViewModel呢?
1个回答

2
你的方向基本正确,只是缺少了一个关键信息。
是的,可以将模型传递给构造函数中的视图模型 - 这被称为依赖项注入,或者另一种方式是控制反转(IoC)。
最简单的实现方式是使用Prism中的UnityContainer。在应用程序启动时,您需要向Unity容器注册接口及其相应的实现类型,然后在之后的代码中调用Resolve<MyInterface>()来获取与该实例相关联的类型的物理实例。
Unity真正帮助您的地方在于当您告诉它要解析一个类型时,它会自动解析尽可能多的构造函数参数。因此,如果您的视图模型的构造函数如下所示:
public class MyViewModel : IMyViewModel
{
    public MyViewModel(IUnityContainer container, IMyModel model)
    {
        _container = container;
        _model = model;
        ...etc...
    }
}

你的观点是这样的:
this.DataContext = container.Resolve<IMyViewModel>();

Unity容器将会创建一个MyViewModel类的实例,同时也会解析并创建与IMyModel相关联的类的实例。

谢谢!我没有使用Prism和UnityContainer。从你提到的内容来看,似乎是要在ViewModel的构造函数中使用一个Model接口。但在这种情况下,ViewModel如何知道Model内部的方法和数据?Model的接口是否是通用的,比如所有Model都实现了IModel,还是每个Model都有一个单独的接口,比如MyFirstModelIMyFirstModelMySecondModelIMyFSecondModel等等? - Carven

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接