La réponse est assez simple: Implémentez un comportement de région personnalisé. Il suffit de tirer de la AutoPopulateRegionBehaviour existante:
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
}
}
}
La dernière étape consiste à remplacer tous AutoPopulateRegionBehaviours ou seulement sur des régions spécifiques. La façon d'y parvenir est décrite en détail dans l'annexe E de la documentation de Prism. Ce que j'ai fait était de ne attacher le comportement qu'à une région spécifique et de remplacer le comportement 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)));
};
}
}
La deuxième approche est contre le principe de modularité. Les vues s'enregistrent dans la région car aucun composant ne connaît chaque vue et donc aucun composant ne peut se déclencher après l'initialisation pour s'y ajouter (ou non) dans une région. – PVitt