Car*_*ven 6 c# design-patterns mvvm
在MVVM设计中,如果View创建ViewModel,ViewModel应该如何知道它的Model?
我从一些地方读到模型可以通过它的构造函数传递给ViewModel.所以它看起来像:
class ViewModel {
private Model _model;
public ViewModel(Model model) {
_model = model;
}
}
Run Code Online (Sandbox Code Playgroud)
由于View正在创建ViewModel,并将Model传递给ViewModel的构造函数,因此View必须知道Model.但是从我从大多数MVVM设计中看到的UML图中,View似乎对模型一无所知.
模型应该如何传递到ViewModel?
您几乎走在正确的轨道上,只是错过了一条关键信息。
是的,模型可以传递给构造函数上的视图模型 - 这称为依赖注入,或者称为控制反转(IoC)。
实现这一目标的最简单方法是使用Prism中的 UnityContainer 。在应用程序启动时,您可以使用 Unity 容器注册接口及其相应的实现类型,从那时起,您可以调用Resolve<MyInterface>()Unity 容器来获取与该实例关联的类型的物理实例。
Unity 真正能帮助您的地方是,当您告诉它解析类型时,它会自动解析尽可能多的构造函数参数。因此,如果视图模型上的构造函数如下所示:
public class MyViewModel : IMyViewModel
{
public MyViewModel(IUnityContainer container, IMyModel model)
{
_container = container;
_model = model;
...etc...
}
}
Run Code Online (Sandbox Code Playgroud)
你的观点是这样做的:
this.DataContext = container.Resolve<IMyViewModel>();
Run Code Online (Sandbox Code Playgroud)
然后,unity 容器将新建一个 MyViewModel 类的实例,因为它也会解析并新建一个与 IMyModel 关联的类的实例。