答えは非常に簡単です。カスタムリージョンの動作を実装します。あなただけの既存の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)));
};
}
}
2番目のアプローチはモジュール性プリンシパルです。各ビューを知っているコンポーネントがないため、ビューはリージョンに登録されます。したがって、初期化後にコンポーネントをトリガーして、リージョン内に追加する(または登録しない)ことはできません。 – PVitt