我通常通过创建某种WindowViewLoaderService来处理这个问题。当你的程序初始化您注册窗口,并且带有代码是这样的你的ViewModels:
WindowViewLoaderService.Register(TypeOf(MainWindowView), TypeOf(MainWindowViewModel);
WindowViewLoaderService.Register(TypeOf(MyWindowView), TypeOf(MyWindowViewModel);
然后,当你能够例如调用到您的ViewModel此服务,并且所有你所引用的其他视图模型。例如,如果你在你的MainWindowViewModel你可能有这样的代码:
var myChildWindowVM = new MyWindowViewModel();
WindowViewLoaderService.ShowWindow(myChildWindowVM)
的WindowViewLoaderService会再看看什么查看与指定视图模型关联你传入。它将创建该视图,将其DataContext设置为您传入的ViewModel,然后显示该视图。
这样你的ViewModels永远不会知道任何视图。
您可以很容易地推出自己的这些服务之一。所有它需要做的就是保持一个字典的关键是你的ViewModelType和值是你的ViewType。 Register方法添加到您的字典中,并且ShowWindow方法根据传入的ViewModel查找正确的视图,创建视图,设置DataContext,然后调用Show。
大多数MVVM框架为您提供了这样的开箱即用功能。例如,Caliburn在本框架中使用命名约定称为ViewLocator。以下是总结的链接:在另一方面http://devlicio.us/blogs/rob_eisenberg/archive/2010/07/04/mvvm-study-segue-introducing-caliburn-micro.aspx
莲花称其为WPFUIVisualizerService你可以在这里的行动看: http://www.codeproject.com/KB/WPF/CinchIII.aspx
这些应该帮助你滚。
我不同意查看代码背后的代码“应该是空的”。虽然有很多事情不应该在代码背后,但它仍然有价值。我将它用于特定于视图层的任何内容,例如管理控制焦点。我也用它来打开WPF中的后续Windows。 – 2011-05-07 14:42:26
乔尔+1。 MVVM实现意味着VIEW SPECIFIC代码是应该位于代码背后的唯一代码。你的视图模型不应该处理像VSM状态变化这样的事情(除非这些变化可能是数据驱动的,在这种情况下,我会把它包装在虚拟机级暴露的行为或触发器中) – 2011-05-08 03:52:20
感谢您的评论。他们真的为我清理了一些东西。 – Sheridan 2011-05-08 15:26:01