Wpf 根据用户权限向区域注册视图
我有一个TabControl作为ItemControl托管一个区域,我们称之为ContentRegion。几个模块将至少一个视图注册到ContentRegion中。但这些注册是在模块初始化期间进行的 我想禁止根据当前用户注册多个视图。但是用户在模块初始化后登录,并且在运行时也可以更改Wpf 根据用户权限向区域注册视图,wpf,mvvm,prism,Wpf,Mvvm,Prism,我有一个TabControl作为ItemControl托管一个区域,我们称之为ContentRegion。几个模块将至少一个视图注册到ContentRegion中。但这些注册是在模块初始化期间进行的 我想禁止根据当前用户注册多个视图。但是用户在模块初始化后登录,并且在运行时也可以更改 是否有一种方法可以提供一个回调,prism可以在该回调中评估注册是否处于活动状态?或者我是否有机会禁用区域经理的注册?还有其他想法吗?您可以将选项卡item.Visibility绑定到一个变量,该变量指示是否应该显
是否有一种方法可以提供一个回调,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));
};
}
}
第二种方法与模块化原则背道而驰。视图注册到区域中,因为没有组件知道每个视图,因此没有组件可以在初始化后触发每个视图以将自身添加(或不添加)到区域中。