我已经启动了WPF应用程序,并希望遵循MVVM ViewModel的第一种方法。
对于导航,我看到了很多选择:
ContentControl
和UserControl
(每个页面都是用户控件)ContentPresenter
和ResourceDictionary
(每个页面都是ResourceDictionary,或简单地说:DataTemplate)Frame
与Page
一起使用第三个选择在我看来是“正确”的方法,因为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紧密相连
简而言之:
任何能在我脑海中清除这一点的信息,将不胜感激。 如果没有Frames and Pages,请随时提出另一种导航机制。