我有一个TabControl作为托管区域的ItemControl,我们称它为ContentRegion。多个模块向ContentRegion注册至少一个视图。但是这些注册是在模块初始化期间进行的。根据用户权限在不同区域注册视图
我想根据当前用户禁止注册几个视图。但是用户在模块初始化之后登录,并且在运行时也可以更改。
有没有办法提供一个回调,其中棱镜可以评估注册是否有效?或者我是否有机会禁用区域经理的注册?任何其他想法?
我有一个TabControl作为托管区域的ItemControl,我们称它为ContentRegion。多个模块向ContentRegion注册至少一个视图。但是这些注册是在模块初始化期间进行的。根据用户权限在不同区域注册视图
我想根据当前用户禁止注册几个视图。但是用户在模块初始化之后登录,并且在运行时也可以更改。
有没有办法提供一个回调,其中棱镜可以评估注册是否有效?或者我是否有机会禁用区域经理的注册?任何其他想法?
答案很简单:实现自定义区域行为。你必须从现有的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)));
};
}
}
您可以将TabItem.Visibility
绑定到指示是否应该显示它的变量。一旦您检查了用户权限,请设置此变量以隐藏不需要的选项卡。
另一种可能性是在检查用户权限后将视图添加到区域,而不是将视图注册到区域。
IRegion detailsRegion = regionManager.Regions["DetailsRegion"];
detailsRegion.Add(view, viewName);
detailsRegion.Activate(view); // not sure if you need the Activate
第二种方法是针对模块化原则。由于没有组件知道每个视图,所以视图向该区域注册,因此没有组件可以在初始化之后触发每个视图以将其本身添加(或不)到区域中。 – PVitt 2010-12-15 14:54:37