如何使用 Prism 自定义适配器“导航”?

Posted

技术标签:

【中文标题】如何使用 Prism 自定义适配器“导航”?【英文标题】:How to "Navigate" with a Prism Custom adapter? 【发布时间】:2022-01-06 05:13:23 【问题描述】:

我有一个 Prism 自定义区域适配器,用于在 DevExpress“DocumentGroup”的不同选项卡中显示每个视图。

为了做到这一点,我有以下 RegionAdapter:

public class DocumentGroupRegionAdapter : RegionAdapterBase<DocumentGroup>

    public DocumentGroupRegionAdapter(IRegionBehaviorFactory regionBehaviorFactory)
        : base(regionBehaviorFactory)
    
    
    protected override void Adapt(IRegion region, DocumentGroup regionTarget)
    
        region.Views.CollectionChanged += (sender, args) =>
        
            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();
    

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 不跟踪选定(活动)项目,基本上是 region.Views = region.ActiveViews。因此,您无法注册 ActiveViews 更改。 收听region.ActiveViews.CollectionChanged 事件。当它触发时,我必须激活 DevExpress 组件 在用户单击选项卡时监听 DevExpress 组件。这是必需的,因为否则 Prism 可能会认为控件已经处于活动状态,而不再处于活动状态。

代码如下:

public class DocumentGroupRegionAdapter : RegionAdapterBase<DocumentGroup>

    public DocumentGroupRegionAdapter(IRegionBehaviorFactory regionBehaviorFactory)
        : base(regionBehaviorFactory)
    
    
    protected override void Adapt(IRegion region, DocumentGroup regionTarget)
    
        region.Views.CollectionChanged += (_, args) =>
        
            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) =>
        
            if (args.Action == NotifyCollectionChangedAction.Add)
            
                foreach (FrameworkElement element in args.NewItems)
                
                    DocumentPanel existingItem = regionTarget.Items.Cast<DocumentPanel>().FirstOrDefault(i => i.Content == element);
                    if (existingItem != null)
                    
                        existingItem.IsActive = true;
                    
                
            
        ;

        regionTarget.SelectedItemChanged += ((_, args) =>
        
            region.Activate(((DocumentPanel)args.Item).Content);
        );
    
    
    protected override IRegion CreateRegion()
    
        return new SingleActiveRegion();
    

现在我已经看到了 Prism 的源代码,我认为编写一个自定义区域也许也可以完成这项工作,我不确定什么时候调用 Activate()

【讨论】:

以上是关于如何使用 Prism 自定义适配器“导航”?的主要内容,如果未能解决你的问题,请参考以下文章

Prism:如何在区域中注入视图模型实例?

在 PRISM 4 中导航到新视图时如何改进传递对象

如何在不使用任何框架(如 PRISM 或任何导航服务)的情况下按照 Xamarin.Forms 中的 MVVM 架构进行导航?

导航到 PRISM 中的新视图时如何传递对象?

在 PRISM 4 中导航到新视图时如何传递对象

8. Prism导航