请举例说明如何使用(您最喜欢的)DI框架为WPF应用程序连接MVVM视图模型?
您是否会创建一个强连接的View Models层次结构(例如,每个嵌套控件的ViewModel是父ViewModel上的属性,并将它绑定到XAML中的嵌套控件的DataContext),或者您将使用某种甚至更多 - 抽象“”视图模型“管理器”,它维护一些弱连接的层次结构......比如CAB,也许?
答案 0 :(得分:6)
如果视图模型只能与另一个一起存在,我会创建一个强大的关系。这就是拥有视图模型将直接引用一个或多个从属视图模型。另一方面,如果视图模型应该能够存在或不存在另一个视图模型,我采用松耦合方法,通过事件总线进行通信。
在使用DI与MVVM方面,绝对可以将两者结合起来。它很简单:
public class MyViewModel
{
private readonly IMyDependency _myDependency;
public MyViewModel(IMyDependency myDependency)
{
_myDependency = myDependency;
}
}
但请注意,这假定MVVM采用“视图模型优先”方法,这有其缺点。
答案 1 :(得分:3)
在WPF中,它通常很简单,并不真正依赖于任何特定的DI容器。你看过Josh Smith's article on MVVM了吗?它几乎描述了如何设置ViewModel的层次结构。
它没有涉及的是如何从依赖项(例如存储库)创建那些ViewModel,但这并不是一个很难的推断。
我经常经历过抽象工厂的自由使用在这方面有很大帮助。我没有直接刷新ViewModels,而是让注入的工厂为我做这件事。
您可以使用穷人的DI或任何类型的DI容器为您连接此类工厂。
答案 2 :(得分:1)
我发布了this article on Code Project关于如何使用MVVM和MEF创建可扩展的WPF应用程序以实现可扩展性。但是,如果仔细观察,我也会使用MEF作为DI。
应用程序完全是MVVM,只使用了DataTemplates(偶尔使用Window),就像Josh Smith的文章一样。 WPF负责为您正确的ViewModel应用正确的View。这很好。
它使用MEF使部件可以相互“找到”。因此,“视图”菜单项的ViewModel使用扩展点找到应该在子菜单中的所有菜单项,并且每个菜单项的ViewModel“找到”它们应该使用它们传递给布局管理器的ViewModel作文点。他们还使用基本服务定位器(MEF)“找到”布局管理器服务。 View菜单示例几乎就是您所讨论的嵌套ViewModel。很酷的是他们在运行之前甚至都不知道彼此。