【发布时间】:2012-01-26 21:15:21
【问题描述】:
使用 Unity 创建视图和视图模型
使用 Unity 作为依赖注入容器类似于使用 MEF,以及基于属性和基于构造函数的注入都是 支持的。主要区别在于类型通常是 在运行时未隐式发现;相反,他们必须是 在容器中注册。
通常,您在视图模型上定义一个接口,以便视图 模型的具体具体类型可以从视图中解耦。为了 例如,视图可以通过 构造函数参数,如此处所示。 C#
public QuestionnaireView() { InitializeComponent(); } public QuestionnaireView(QuestionnaireViewModel viewModel) : this() { this.DataContext = viewModel; }默认无参数 构造函数是允许视图在设计时工作所必需的 工具,例如 Visual Studio 和 Expression Blend。
或者,您可以在 视图,如图所示。 Unity 将实例化所需的视图模型 并在实例化视图后调用属性设置器。 C#
public QuestionnaireView() { InitializeComponent(); } [Dependency] public QuestionnaireViewModel ViewModel { set { this.DataContext = value; } }视图模型类型注册到Unity容器中,如图 这里。 C#
IUnityContainer container; container.RegisterType<QuestionnaireViewModel>();然后可以通过容器实例化视图,如图 这里。 C#
IUnityContainer container; var view = container.Resolve<QuestionnaireView>();
-
1234563看来 ViewModel 和 View 似乎一切正常。那么注册ViewModel和实例化View的代码需要什么?
第一个示例,使用构造函数挂钩 View 和 ViewModel,完全没有提到 Unity,那么这里真的使用 Unity 吗?
与基于构造函数的注入相比,使用基于属性的注入是否有任何优势,或者它们是否完全相同?
正文的第一部分说“*通常,您在视图模型上定义一个接口,以便可以将视图模型的特定具体类型与视图解耦”,然后给出一个示例。然而这个例子根本没有提到接口。这是怎么回事,我错过了什么吗?
【问题讨论】:
-
我喜欢使用微软的 Prism 库,但是我觉得他们使用 Views 进行导航的例子是个坏主意,因为我认为 ViewModels 应该在使用 MVVM 设计模式时控制应用程序流,而不是 Views .如果您尝试在应用程序中使用 MVVM,我建议您使用
ApplicationViewModel来处理窗口管理,并让 WPF 通过 DataTemplates 解析要使用的视图。
标签: c# wpf mvvm prism unity-container