Получите представление в своем собственном RegionAdapter при навигации по PRISM

Я работаю с PRISM и пытаюсь научиться правильно его использовать. Пока что я создал 3 вида:

  • MainWindow: это моя оболочка, содержащая 2 кнопки для навигации: ViewA, ViewB
  • ViewA
  • ViewB

В командной консоли размещается регион (DockManager из SyncFusion) для добавления представлений. Внутри ViewModel оболочки я использую DelegateCommand для навигации:

_regionManager.RequestNavigate("ContentRegion", uri);

Представления зарегистрированы внутри Bootstrapper

Container.RegisterTypeForNavigation<ViewA>("ViewA");
Container.RegisterTypeForNavigation<ViewB>("ViewB");

Это прекрасно работает, когда я использую простой TabControl для размещения моего региона. Чтобы использовать DockManager из SyncFusion Toolkit, я создал адаптер и переопределил функцию:

protected override void Adapt(IRegion region, DockingManager regionTarget)
    {
        region.Views.CollectionChanged += delegate
        {
            foreach (var child in region.Views.Cast<UserControl>())
            {
                if (!regionTarget.Children.Contains(child))

                {
                    regionTarget.BeginInit();
                    regionTarget.Children.Add(child);
                    regionTarget.EndInit();
                }
            }
        };
        regionTarget.WindowClosing += delegate (object sender, WindowClosingEventArgs args)
        {
            var child = args.TargetItem as UserControl;
            region.Remove(child);
        };
        regionTarget.CloseButtonClick += delegate (object sender, CloseButtonEventArgs args) 
        {
            var child = args.TargetItem as UserControl;
            region.Remove(child);
        };

        region.NavigationService.Navigated += RegionTarget_Navigated;        
    }
private void RegionTarget_Navigated(object sender, RegionNavigationEventArgs e)
    {

    }

То, что я сейчас пытаюсь решить, - это случай перехода к представлению, которое уже содержится в моем DockingManager. В этом случае представление должно быть установлено как активное. Чтобы добиться этого, я попытался подписаться на "Навигацию" - событие региона. Будет ли это правильный путь? Как я могу получить правильный вид из Navigation-URI? Или я должен попытаться обработать этот сценарий в моих моделях представления (с OnNavigatedTo от INavigationAware).

2 ответа

Активация может быть обработана путем прослушивания события ActiveViews.CollectionChanged, а затем активации правильной вкладки в вашем элементе управления стыковкой. Было бы лучше иметь собственный обработчик RegionBehavior для вас, а не помещать его в RegionAdapter.

Вы можете использовать этот пост в блоге о написании адаптера для Infragistics xamDockManager в качестве руководства: http://brianlagunas.com/xamdockmanager-prism-region-adapter-update-3/

Вы можете установить активное окно в DockingManager на основе URI навигации из события Navigated NavigationService. Пожалуйста, скачайте образец по следующей ссылке. http://www.syncfusion.com/downloads/support/directtrac/172521/ze/PrismUnityApp71278521315.zip

Другие вопросы по тегам