Я запустил приложение WPF и хочу использовать первый подход MVVM ViewModel.
Для навигации я видел много вариантов:
- с использованием
ContentControl
иUserControl
s (каждая страница является пользовательским контролем) - с использованием
ContentPresenter
и ResourceDictionary
s (каждая страница является ResourceDictionary или просто говорит: DataTemplate) - с использованием
Frame
с Page
s
Третий вариант, как мне кажется, это «правильный» подход, поскольку ContentControl
предназначен для определения элемента управления Xaml, а не страницы.
Я создал базовую навигационную службу, которая содержит ссылку на главное окно Frame.
Теперь я в замешательстве на уровне того, как я могу создавать свои 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создается в классе, который вызывает метод навигацииd (и это место будет другой ViewModel), например:
//this code is defined inside my FirstViewModel
var vm = new SecondViewModel(args);
navigationService.Navigate(SecondViewModel);
Как мне избавиться от этого экземпляра ViewModel?Я не хочу, чтобы моя viewModel отвечала за создание других viewModel, мне это не кажется правильным?
Также этот ViewFactory заставляет меня иметь одну ViewModel для View
Я могу пойти и сделать что-то подобное в View xaml:
DataContext="{Binding FirstViewModel, Source={StaticResource ViewModelLocator}}"
Но это уже не сначала ViewModel, и мое представление сильно привязано кsingle ViewModel
Короче говоря:
- Как мне перемещаться между различными представлениями в первом подходе ViewModel с использованием фрейма и страниц, без «жесткого кода» моих viewModelsИнстангируя друг друга?
Буду признателен за любую информацию, которая может это прояснить в моей голове.не стесняйтесь предложить другой механизм навигации, если не с рамками и страницами.