2010-12-15 78 views
3

我有一个TabControl作为托管区域的ItemControl,我们称它为ContentRegion。多个模块向ContentRegion注册至少一个视图。但是这些注册是在模块初始化期间进行的。根据用户权限在不同区域注册视图

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

有没有办法提供一个回调,其中棱镜可以评估注册是否有效?或者我是否有机会禁用区域经理的注册?任何其他想法?

回答

4

答案很简单:实现自定义区域行为。你必须从现有的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))); 
     }; 
    } 
} 
0

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

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

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

第二种方法是针对模块化原则。由于没有组件知道每个视图,所以视图向该区域注册,因此没有组件可以在初始化之后触发每个视图以将其本身添加(或不)到区域中。 – PVitt 2010-12-15 14:54:37