Prism: объявить некоторые представления, для работы которых требуется некоторая служба

#c# #wpf #mvvm #prism

#c# #wpf #mvvm #prism

Вопрос:

У меня есть приложение WPF, которое отображает сервер.

У меня есть одна область с двумя возможными представлениями: одно — экран приветствия, другое — информация о запущенном экземпляре

В настоящее время процесс следующий:

  1. Запустите приложение
  2. Приложение отобразит экран приветствия и некоторую опцию для загрузки одного из файлов конфигурации
  3. Выберите файл конфигурации сервера для открытия
  4. Сервер инициализируется в соответствии с этой конфигурацией
  5. Как только сервер инициализирован, я прошу приложение «перейти» к другому представлению.

Проблема в том, что Prism, похоже, инициализирует ViewModel моего представления «InstanceInformation», как только я его регистрирую:

m_regionManager.RegisterViewWithRegion(RegionsNames.MAIN_TAB_REGION, typeof(StatusView));

Это слишком рано, потому что для этой ViewModel требуются некоторые службы, которые еще не инициализированы (потому что они даже не знают, какой сервер мы выбрали).

Есть ли способ создать экземпляр ViewModel моего навигируемого представления только при переходе к нему?

Ответ №1:

Вы используете RegisterViewWithRegion только тогда, когда хотите мгновенно перейти к этому представлению. Не используйте это, если вы не хотите, чтобы ваше представление отображалось в регионе сразу после создания региона. В противном случае используйте либо IRegion.Добавить или запросить навигацию.

Комментарии:

1. Я использовал RequestNavigate, но это отображало систему. Объект, а не мой элемент управления. Итак, я подумал, что перед навигацией необходимо выполнить навигацию. как URI должен быть сгенерирован на основе моего StatusView представления, которое я хочу отобразить? Является ли это полным пространством имен? Какой-то относительный путь? Просто название?

2. Это потому, что сначала вам нужно зарегистрировать свои представления для навигации. В противном случае он покажет System. Объект

3. И это не метод «RegisterViewWithRegion», который выполняет эту работу?

4. Нет, registerViewWithRegion использует обнаружение представления для создания и внедрения представления при создании региона. Это не называется RegisterViewForNavigation, который является другим методом расширения вне контейнера.

Ответ №2:

Есть ли способ создать экземпляр ViewModel моего навигируемого представления только при переходе к нему?

Модель представления будет создана при первом переходе к представлению (путем вызова RegionManager.RequestNavigate("nameOfTheView") ), если вы не реализуете IRegionMemberLifetime и не возвращаетесь false из KeepAlive , и в этом случае представление и его модель представления будут воссоздаваться при каждом переходе к ним.

Чтобы навигация работала, вы должны сделать представление известным как цель навигации с помощью Container.RegisterTypeForNavigation<TypeOfTheView>("nameOfTheView") … если "nameOfTheView" это так nameof(TypeOfTheView) , вы можете опустить параметр, поскольку он используется по умолчанию.

Примечание сбоку: вы можете передавать параметры с навигацией, которые передаются в, OnNavigatedTo если вы реализуете INavigationAware , независимо от того, используете ли вы повторно представление / модель представления или воссоздаете их.