Использую в приложении WPF и Prism c UnityContainer. Внутри приложения запускается отдельное окно со следующим содержимым:
То есть окно содержит регион, в котором по нажатию соответствующей RadioButton будет меняться содержимое. Для этого имеются соответствующие подокна и в стартовом модуле происходит их инициализация:
RegionManager.RegisterViewWithRegion("TypeSchemeRegion", typeof(SchemeAutoView));
RegionManager.RegisterViewWithRegion("TypeSchemeRegion", typeof(SchemeSingleView));
RegionManager.RegisterViewWithRegion("TypeSchemeRegion", typeof(SchemeSelectView));
При открытии окна из программы исполняется следующий код:
var schemeView = unityContainer.Resolve
regionManager.Regions.Remove("TypeSchemeRegion");
RegionManager.SetRegionManager(schemeView, regionManager);
(SchemeView это самое запускаемое окно)
В этом месте все три подокна имеются в списке Views у региона, активным окном (ActiveView) является SchemeAutoView. При старте окна отображается содержимое подокна SchemeAutoView.
По нажатию соответствующей RadioButton исполняется код:
_regionManager?.RequestNavigate("TypeSchemeRegion", new Uri("SchemeSingleView", UriKind.Relative));
или:
_regionManager?.RequestNavigate("TypeSchemeRegion", new Uri("SchemeSelectView", UriKind.Relative));
Теперь, если проверить в Debuge содержимое региона, то активное окно соответственно меняется. Однако на экране ничего не происходит, по-прежнему отображается первое активное подокно. Для всех окон используется одна ViewModel.
Самое интересное, что в главном окне приложения (Shell) используется эта же методика и все работает на "ура", а в отдельном окне не хочет работать.
Что делаю не так?
Ответ
Нашел ошибку сам.
Оказывается при работе с Prism, если стартуешь внутри программы новое окно, которое, скажем так, не находиться в контексте главного окна (Shell), необходимо процедуру регистрации окон в регионах повторять почти так же, как в стартовом модуле. Ну или, по крайней мере, у меня так произошло.
Итак код при старте нового окна:
regionManager.Regions.Remove("TypeSchemeRegion");
var schemeView= unityContainer.Resolve
И еще очень важно сначала удалить необходимый регион, затем обязательно сделать Resolve соответствующего окна. В этот момент к окну привязывается ViewModel (если это необходимо) через Dependency Property, затем необходимо произвести переустановку RegionManager и новую привязку окон к региону.
Дальше в соответствующих местах RequestNavigate работает без проблем.
Комментариев нет:
Отправить комментарий