Работа с вложенными представлениями с использованием Prism с IsNavigationTarget, который может возвращать false
Я пытаюсь найти решение следующей проблемы. У меня есть приложение WPF, я использовал mvvm и prism (последняя версия 7) для его создания. Вот черновик формы / диалога, над которым я работаю:
MainView имеет region - region1, я вставляю SubViewA в region1 на основе того, что выбрано в древовидном представлении. Это представление представляет собой содержимое элемента дерева. SubViewA itslef имеет область - region2, а другое представление - SubViewB вводится в область2 на основе выбора поля со списком.
Я использую INavigationAware для управления инъекцией в регион.
Итак, чтобы ввести представление в область, я использую из MainViewModel следующее:
_regionManager.RequestNavigate(regionName, viewName, callBack, parameters);
В SubViewAViewModel я реализую INavigationAware, и для повторного использования созданных представлений я проверяю, было ли создано представление для каждого элемента дерева. Для этого я добавляю в параметры treeitemId, а затем проверяю этот идентификатор в методе IsNavigationTarget следующим образом:
bool IsNavigationTarget(NavigationContext navigationContext)
{
// get id parameter from navigationContext.Parameters
// check if subviewA for treeitemId was already shown and return true,
// i use dictionary, where i store ids of all items that were selected in the past
// otherwise return false.
}
Тот же метод, который я использую, когда хочу ввести SubViewB в область 2 SubViewA. В основном, когда пользователь меняет раскрывающийся список, вводится новый SubViewB.
Теперь мой вопрос: если я использую INavigationAware в SubViewBViewModel и когда IsNavigationTarget всегда возвращает true - все хорошо. Когда я пытаюсь повторно использовать представления и снова выбираю, что вернуть, истина или ложь, тогда, когда я выбираю второй элемент в древовидном представлении, я получаю исключение: "Регион с заданным именем уже зарегистрирован" - призма жалуется, что регион2 уже был зарегистрирован.
Я знаю, что могу иметь службу и всегда заполнять данные из службы, когда отображается представление, и поэтому мне не нужно повторно использовать представления. Но это более академический вопрос - как правильно его решить?
PS Я пытался зарегистрировать регионального менеджера с областью действия, но мне это не удалось, моя проблема в том, что я не знаю, где лучше всего создать новый менеджер с областью действия и как ввести его в модель просмотра. Родительская ViewModel - не лучшее место для этого, потому что мне нужно открывать представление. Если я пытаюсь использовать прикрепленное поведение, то кажется, что содержимое области обновляется до того, как вызывается поведение.
PS2 Я нашел пример из множественного числа (Брайана Лагунаса), где он создает две оболочки, но это отличается от того, чего я хочу достичь. Он создает новый диспетчер области видимости для каждого окна в момент создания окна. А также, если само окно будет иметь такую же структуру, как я показал выше, оно тоже выйдет из строя.
PS3 Я смотрел недавние стримы от Брайана Лагунаса, где он пишет Outlook с нуля, его подход основан на поведении, он связывает некоторое представление с зависимыми представлениями, он работает нормально, но опять же в его примере зависимые представления не содержат регионов.
Спасибо.
0 ответов
Для тех, кто интересуется подробностями, вы должны посмотреть следующие курсы множественного числа: pluralsight.pxf.io/XVxR5 & pluralsight.pxf.io/B6X99. Один посвящен нескольким оболочкам, а другой - управлению с вкладками, который называется "Проблемы и решения Prism: освоение TabControl" - этот курс мне помог.
Короче говоря, проблема заключается в том, как внедрить область видимости в основную модель просмотра. Чтобы решить эту проблему, мы переопределили ScopedRegionNavigationContentLoader plus, чтобы контролировать, хотим ли мы внедрить региональный менеджер с областью действия или глобальный, который у нас есть для маркировки интерфейсов.
Я создал еще один вопрос, похожий на текущий: проверьте выбросы и исключения Prism 7 при работе с вложенными представлениями. Это даст вам более подробную информацию.