我有一個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