wpf - 根据用户权限向区域注册 View

标签 wpf mvvm prism

我有一个 TabControl 作为承载区域的 ItemControl,我们称之为 ContentRegion。多个模块将至少一个 View 注册到 ContentRegion。但是这些注册是在模块初始化期间进行的。

我想根据当前用户禁止注册多个 View 。但用户在模块初始化后登录,也可以在运行时更改。

有没有办法提供回调,prism 可以评估注册是否处于事件状态?还是我有机会禁用区域经理的注册?还有其他想法吗?

最佳答案

答案很简单:实现自定义区域行为。您只需从现有的 AutoPopulateRegionBehaviour 派生:

public class SecurityEnabledAutoPopulateRegionBehaviour : AutoPopulateRegionBehavior
{
    IUnityContainer container;

    public SecurityEnabledAutoPopulateRegionBehaviour(IUnityContainer container, IRegionViewRegistry regionViewRegistry)
        :base(regionViewRegistry)
    {
        this.container = container;
    }

    protected override void AddViewIntoRegion(object viewToAdd)
    {
        IRequiredAccessRight viewPermission = viewToAdd as IRequiredAccessRight;
        if ( viewPermission != null )
        {
            ISessionManager sessionManager = container.Resolve<ISessionManager>( );
            if ( sessionManager.AccessRights.IsGranted( viewPermission.RequiredAccessRight ) )
            {
                this.Region.Add( viewToAdd );
            }
        }
        else
        {
            this.Region.Add( viewToAdd ); //The region does not require any permissions so we can proceed
        }
    }
}

最后一步是覆盖所有 AutoPopulateRegionBehaviours 或仅覆盖特定区域。 Prism 文档的附录 E 中详细描述了如何实现这一点。我所做的是将行为仅附加到特定区域并替换 AutoPopulateRegionBehaviour:
public partial class MyView : UserControl
{
    public MainView( IUnityContainer container ) 
    {
        InitializeComponent( );

        ObservableObject<IRegion> observableRegion = RegionManager.GetObservableRegion( ControlHostingTheRegion );

        observableRegion.PropertyChanged += ( sender, args ) =>
        {
            IRegion region = ( (ObservableObject<IRegion>)sender ).Value;
            region.Behaviors.Add( AutoPopulateRegionBehavior.BehaviorKey,
                (SecurityEnabledAutoPopulateRegionBehaviour)container.Resolve( typeof( SecurityEnabledAutoPopulateRegionBehaviour ) ) );
        };
    }
}

关于wpf - 根据用户权限向区域注册 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4450199/

相关文章:

c# - 将行为附加到 MetroWindow 失败并导致错误的样式

c# - 如何创建具有可变数量 StackPanel 的 StackPanel 的 DataTemplate

c# - MVVM 将 View 绑定(bind)到可变模型

c# - WPF MVVM 后台打印数据绑定(bind)问题

wpf - Avalon Dock float 窗口 - ShowInTaskBar

WPF关闭子关闭父窗口

基于 View 属性的WPF颜色节点

c# - 从 ViewModel 打开一个窗口

c# - 滑动覆盖面板

c# - 将数据保存在多个 ViewModel 使用的文件中