模型应该如何传递到ViewModel?

时间:2012-10-26 03:02:50

标签: c# design-patterns mvvm

在MVVM设计中,如果View创建了ViewModel,ViewModel应该如何知道它的Model?

我从一些地方读到模型可以通过它的构造函数传递给ViewModel。所以它看起来像:

class ViewModel {
   private Model _model;
   public ViewModel(Model model) {
      _model = model;
   }
}

由于View正在创建ViewModel,并将Model传递给ViewModel的构造函数,因此View必须知道Model。但是从我从大多数MVVM设计中看到的UML图中,View似乎对模型一无所知。

如何将模型传递到ViewModel?

1 个答案:

答案 0 :(得分:2)

你几乎走在正确的轨道上,你只是错过了一条至关重要的信息。

是的,可以将模型传递给构造函数上的viewmodel - 这称为依赖注入,或者称为Inversion of Control(IoC)。

实现此目的的最简单方法是使用Prism中的UnityContainer。在应用程序启动的某处,您可以使用unity容器注册接口及其相应的实现类型,然后在Unity容器上调用Resolve<MyInterface>()以获取与该实例关联的类型的物理实例。

Unity真正帮助你的是它会在你告诉它解析一个类型时自动解析尽可能多的构造函数参数。因此,如果viewmodel上的构造函数如下所示:

public class MyViewModel : IMyViewModel
{
    public MyViewModel(IUnityContainer container, IMyModel model)
    {
        _container = container;
        _model = model;
        ...etc...
    }
}

并且您的观点是这样做的:

this.DataContext = container.Resolve<IMyViewModel>();
然后,Unity容器将新建一个MyViewModel类的实例,因为它会解析并新建一个与IMyModel相关联的类的实例。