#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:
Для тех, кто заинтересован, мне пришлось сделать несколько вещей, чтобы решить эту проблему:
- Переключитесь на
SingleActiveRegion
«вместоAllActiveRegion
«. AllActiveRegion не отслеживает выбранный(активный) элемент, в основном регион.Просмотры = регион.Активные просмотры. Таким образом, вы не можете зарегистрироваться для изменений в ActiveViews. - Прислушайтесь к
region.ActiveViews.CollectionChanged
событию. Когда он срабатывает, я должен активировать компонент DevExpress - Прослушивайте компонент 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()