Навигация по WPF и создание экземпляров ViewModel с использованием первой архитектуры MVVM Viewmodel - PullRequest
3 голосов
/ 09 мая 2019

Я запустил приложение 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Инстангируя друг друга?

Буду признателен за любую информацию, которая может это прояснить в моей голове.не стесняйтесь предложить другой механизм навигации, если не с рамками и страницами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...