使用MVVM Viewmodel优先架构的WPF导航和ViewModel实例化

时间:2019-05-09 10:35:23

标签: .net wpf mvvm navigation

我已经启动了WPF应用程序,并希望遵循MVVM ViewModel的第一种方法。

对于导航,我看到了很多选择:

  • 使用ContentControlUserControl(每个页面都是用户控件)
  • 使用ContentPresenterResourceDictionary(每个页面都是ResourceDictionary,或简单地说:DataTemplate)
  • FramePage一起使用

第三个选择在我看来是“正确”的方法,因为ContentControl用于定义Xaml控件,而不是页面。

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

我现在的困惑在于如何创建我的Views和ViewModels而不破坏MVVM模式。

我考虑过要做类似ViewFactory的事情:

ViewFactory.Register(typeof(FirstViewModel), typeof(FirstPage));
ViewFactory.Register(typeof(SecondViewModel), typeof(SecondPage));
ViewFactory.Register(typeof(ThirdViewModel), typeof(ThirdPage));

然后在我的NavigationService中,像(伪代码)一样进行导航:

public void Navigate(ViewModel viewModel) {
  Type viewType = ViewFactory.GetView(viewModel.GetType());
  Page page;
  page = (Page)Activator.CreateInstance(viewType);
  // set the data context of the page with the passed 'viewModel'
  // put that view in the Frame like : _frame.NavigateTo(page)
}

但是在这种情况下,viewModel在调用导航方法的类中实例化(该位置将是另一个ViewModel),例如:

//this code is defined inside my FirstViewModel
var vm = new SecondViewModel(args);
navigationService.Navigate(SecondViewModel);
  • 如何摆脱这种ViewModel实例化?我不希望我的viewModel负责创建其他viewModel,这听起来不对吗?

  • 此外,这个ViewFactory强制我每个View具有一个viewModel

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

DataContext="{Binding FirstViewModel, Source={StaticResource ViewModelLocator}}"

但这不是ViewModel首先,我的视图与单个ViewModel紧密相连

简而言之:

  • 我如何使用Frame和Pages在ViewModel first方法中的不同视图之间导航,而我的viewModels不会“硬编码”彼此实例化?

任何能在我脑海中清除这一点的信息,将不胜感激。 如果没有Frames and Pages,请随时提出另一种导航机制。

0 个答案:

没有答案