我通常通过创建某种 WindowViewLoaderService 来处理这个问题。当您的程序初始化时,您可以使用如下代码注册您的 Window 和 ViewModel:
WindowViewLoaderService.Register(TypeOf(MainWindowView), TypeOf(MainWindowViewModel));
WindowViewLoaderService.Register(TypeOf(MyWindowView), TypeOf(MyWindowViewModel));
然后,当您可以从 ViewModel 调用此服务时,您只需引用其他 ViewModel。例如,如果您在 MainWindowViewModel 中,您可能有如下代码:
var myChildWindowVM = new MyWindowViewModel();
WindowViewLoaderService.ShowWindow(myChildWindowVM);
然后 WindowViewLoaderService 将查找与您传递给它的指定 ViewModel 关联的 View。它将创建该视图,将其 DataContext 设置为您传入的 ViewModel,然后显示该视图。
这样你的 ViewModel 永远不会知道任何 View。
您可以非常轻松地推出自己的其中一项服务。它所需要做的就是保留一个字典,其中键是您的 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 http://devlicio.us/blogs/rob_eisenberg/archive/2010/07/04/mvvm-study-segue-introducing-caliburn-micro.aspx
另一方面,Cinch 将其称为 WPFUIVisualizerService,您可以在此处查看其实际效果:http://www.codeproject.com/KB/WPF/CinchIII.aspx http://www.codeproject.com/KB/WPF/CinchIII.aspx
这些应该可以帮助您顺利进行。