2010-12-15 38 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