Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 根据用户权限向区域注册视图_Wpf_Mvvm_Prism - Fatal编程技术网

Wpf 根据用户权限向区域注册视图

Wpf 根据用户权限向区域注册视图,wpf,mvvm,prism,Wpf,Mvvm,Prism,我有一个TabControl作为ItemControl托管一个区域,我们称之为ContentRegion。几个模块将至少一个视图注册到ContentRegion中。但这些注册是在模块初始化期间进行的 我想禁止根据当前用户注册多个视图。但是用户在模块初始化后登录,并且在运行时也可以更改 是否有一种方法可以提供一个回调,prism可以在该回调中评估注册是否处于活动状态?或者我是否有机会禁用区域经理的注册?还有其他想法吗?您可以将选项卡item.Visibility绑定到一个变量,该变量指示是否应该显

我有一个TabControl作为ItemControl托管一个区域,我们称之为ContentRegion。几个模块将至少一个视图注册到ContentRegion中。但这些注册是在模块初始化期间进行的

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


是否有一种方法可以提供一个回调,prism可以在该回调中评估注册是否处于活动状态?或者我是否有机会禁用区域经理的注册?还有其他想法吗?

您可以将
选项卡item.Visibility
绑定到一个变量,该变量指示是否应该显示它。检查用户权限后,设置此变量以隐藏不需要的选项卡

另一种可能是在检查用户权限后将视图添加到区域,而不是向区域注册视图

IRegion detailsRegion = regionManager.Regions["DetailsRegion"];
detailsRegion.Add(view, viewName);
detailsRegion.Activate(view); // not sure if you need the Activate

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

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
        }
    }
}
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 ) ) );
        };
    }
}
public class securityEnableDautopulateregionBehaviour:AutoPopulateRegionBehaviour
{
i单元容器;
公共安全使能Dautopulateregionbehaviour(IUnityContainer容器,iRegionViewRegionViewRegionRegionRegionRegionRegionRegionRegistry)
:base(regionViewRegistry)
{
this.container=容器;
}
受保护的覆盖void AddViewIntoRegion(对象视图添加)
{
IRequiredAccessRight viewPermission=视图添加为IRequiredAccessRight;
if(viewPermission!=null)
{
ISessionManager sessionManager=container.Resolve();
if(sessionManager.AccessRights.isgrated(viewPermission.RequiredAccessRight))
{
this.Region.Add(viewToAdd);
}
}
其他的
{
this.Region.Add(viewToAdd);//该区域不需要任何权限,因此我们可以继续
}
}
}
最后一步是覆盖所有AutoPopulateRegionBehavior或仅覆盖特定区域。Prism文档的附录E详细描述了如何实现这一点。我所做的是仅将行为附加到特定区域,并替换AutoPopulateRegionBehavior:

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
        }
    }
}
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 ) ) );
        };
    }
}
公共部分类MyView:UserControl { 公共主视图(IUnityContainer容器) { 初始化组件(); ObservateObject ObservateRegion=RegionManager.GetObservateRegion(控制宿主此区域); observableRegion.PropertyChanged+=(发送方,参数)=> { IRegion region=((observeObject)sender).Value; region.Behaviors.Add(AutoPopulateRegionBehavior.BehaviorKey, (SecurityEnableDautopulateregionBeviour)容器。解析(类型为(SecurityEnableDautopulateregionBeviour)); }; } }
第二种方法与模块化原则背道而驰。视图注册到区域中,因为没有组件知道每个视图,因此没有组件可以在初始化后触发每个视图以将自身添加(或不添加)到区域中。