Как «перемещаться» с помощью пользовательского адаптера Prism?

#wpf #xaml #devexpress #prism

Вопрос:

У меня есть адаптер пользовательского региона Prism, чтобы отображать каждое представление на другой вкладке нашей «Группы документов»DevExpress.

Для этого у меня есть следующий региональный адаптер:

 public class DocumentGroupRegionAdapter : RegionAdapterBaselt;DocumentGroupgt; {  public DocumentGroupRegionAdapter(IRegionBehaviorFactory regionBehaviorFactory)  : base(regionBehaviorFactory)  {  }  protected override void Adapt(IRegion region, DocumentGroup regionTarget)  {  region.Views.CollectionChanged  = (sender, args) =gt;  {  if (args.Action == NotifyCollectionChangedAction.Add)  {  foreach (FrameworkElement element in args.NewItems)  {  DocumentPanel documentPanel = new DocumentPanel {Content = element, DataContext = element.DataContext};  regionTarget.Items.Add(documentPanel);  }  }  };  }  protected override IRegion CreateRegion()  {  return new AllActiveRegion();  } }  

С учетом того, что весь регион является:

 public class AllActiveRegion : Region {  public override IViewsCollection ActiveViews  {  get { return Views; }  }   public override void Deactivate(object view)  {  throw new InvalidOperationException(Resources.DeactiveNotPossibleException);  } }  

И мы регистрировали несколько просмотров для этого региона:

 _regionManager.RegisterViewWithRegion(Regions.MainSections, typeof(Views.Layout.RootView)); _regionManager.RegisterViewWithRegion(Regions.MainSections, typeof(Views.Configure.RootView)); _regionManager.RegisterViewWithRegion(Regions.MainSections, typeof(Views.Dashboard.RootView));  

До сих пор это работало нормально, но теперь, при определенных параметрах, нам нужно активировать одну из вкладок. Это можно было бы сделать, позвонив item.IsActive = true .

Как мне указать, по какому элементу я тоже хочу перемещаться?

Что я должен переопределить, чтобы установить этот активный элемент?

Ответ №1:

Для тех, кто заинтересован, мне пришлось сделать несколько вещей, чтобы решить эту проблему:

  1. Переключитесь на SingleActiveRegion «вместо AllActiveRegion «. AllActiveRegion не отслеживает выбранный(активный) элемент, в основном регион.Просмотры = регион.Активные просмотры. Таким образом, вы не можете зарегистрироваться для изменений в ActiveViews.
  2. Прислушайтесь к region.ActiveViews.CollectionChanged событию. Когда он срабатывает, я должен активировать компонент DevExpress
  3. Прослушивайте компонент DevExpress, когда пользователь нажимает на вкладки. Это необходимо, потому что в противном случае Prism может подумать, что элемент управления уже активен, и не активирует его снова.

Код выглядит так:

 public class DocumentGroupRegionAdapter : RegionAdapterBaselt;DocumentGroupgt; {  public DocumentGroupRegionAdapter(IRegionBehaviorFactory regionBehaviorFactory)  : base(regionBehaviorFactory)  {  }  protected override void Adapt(IRegion region, DocumentGroup regionTarget)  {  region.Views.CollectionChanged  = (_, args) =gt;  {  if (args.Action == NotifyCollectionChangedAction.Add)  {  foreach (FrameworkElement element in args.NewItems)  {  DocumentPanel documentPanel = new() {Content = element, DataContext = element.DataContext};     regionTarget.Items.Add(documentPanel);  }  }  };   region.ActiveViews.CollectionChanged  = (_, args) =gt;  {  if (args.Action == NotifyCollectionChangedAction.Add)  {  foreach (FrameworkElement element in args.NewItems)  {  DocumentPanel existingItem = regionTarget.Items.Castlt;DocumentPanelgt;().FirstOrDefault(i =gt; i.Content == element);  if (existingItem != null)  {  existingItem.IsActive = true;  }  }  }  };   regionTarget.SelectedItemChanged  = ((_, args) =gt;  {  region.Activate(((DocumentPanel)args.Item).Content);  });  }    protected override IRegion CreateRegion()  {  return new SingleActiveRegion();  } }  

Теперь, когда я увидел исходный код Prism, я думаю, что написание пользовательского региона, возможно, также могло бы выполнить эту работу, я не совсем уверен, когда вызывается Activate()