.net 使用MVVM ViewModel-first体系结构的WPF导航和ViewModel实例化

.net 使用MVVM ViewModel-first体系结构的WPF导航和ViewModel实例化,.net,wpf,mvvm,navigation,.net,Wpf,Mvvm,Navigation,我已经启动了一个WPF应用程序,希望遵循MVVM ViewModel优先的方法 对于导航,我看到了许多选项: 使用ContentControl和UserControls(每个页面都是一个UserControl) 使用ContentPresenter和ResourceDictionarys(每个页面都是一个ResourceDictionary,或者简单地说:一个DataTemplate) 使用框架和页面s 第三个选项在我看来是“正确”的方法,因为ContentControl用于定义Xaml控件

我已经启动了一个WPF应用程序,希望遵循MVVM ViewModel优先的方法

对于导航,我看到了许多选项:

  • 使用
    ContentControl
    UserControl
    s(每个页面都是一个UserControl)
  • 使用
    ContentPresenter
    ResourceDictionary
    s(每个页面都是一个ResourceDictionary,或者简单地说:一个DataTemplate)
  • 使用
    框架
    页面
    s
第三个选项在我看来是“正确”的方法,因为
ContentControl
用于定义Xaml控件,而不是页面

我创建了一个基本的导航服务,其中包含对主窗口框架的引用

我现在的困惑在于如何在不破坏MVVM模式的情况下创建视图和视图模型

我想做一些类似ViewFactory的事情:

ViewFactory.Register(typeof(FirstViewModel), typeof(FirstPage));
ViewFactory.Register(typeof(SecondViewModel), typeof(SecondPage));
ViewFactory.Register(typeof(ThirdViewModel), typeof(ThirdPage));
然后在我的导航服务中,像(伪代码)一样导航:

但在本例中,viewModel在调用navigate方法的类中实例化(该位置将是另一个viewModel),如下所示:

  • 如何摆脱此ViewModel实例化?我不想让我的viewModel负责创建其他viewModel,这听起来不对吗

  • 此外,此ViewFactory强制我为每个视图创建一个viewModel

我可以在视图xaml中执行以下操作:

DataContext="{Binding FirstViewModel, Source={StaticResource ViewModelLocator}}"
但这不再是ViewModel的第一个视图,我的视图强烈附加到单个ViewModel

简而言之:

  • 在ViewModel first方法中,如何使用框架和页面在不同视图之间导航,而不用viewModels“硬代码”彼此实例化
任何能在我脑海中澄清这一点的信息都将不胜感激。
如果没有框架和页面,请随意提出另一种导航机制。

如果这似乎很长,您可以直接阅读“简言之”问题
//this code is defined inside my FirstViewModel
var vm = new SecondViewModel(args);
navigationService.Navigate(SecondViewModel);
DataContext="{Binding FirstViewModel, Source={StaticResource ViewModelLocator}}"