2010-12-15 78 views
3

J'ai un TabControl en tant que ItemControl hébergeant une région, appelons-le ContentRegion. Plusieurs modules enregistrent au moins une vue dans ContentRegion. Mais ces enregistrements sont faits lors de l'initialisation du module.Enregistrer des vues avec des régions en fonction des droits de l'utilisateur

Je souhaite interdire l'enregistrement de plusieurs vues en fonction de l'utilisateur actuel. Mais l'utilisateur se connecte après l'initialisation du module et peut également changer pendant l'exécution.

Existe-t-il un moyen de fournir un rappel où le prisme peut évaluer si l'enregistrement est actif? Ou est-ce que j'ai la possibilité de désactiver les enregistrements du gestionnaire de région? D'autres idées?

Répondre

4

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))); 
     }; 
    } 
} 
0

Vous pouvez lier le TabItem.Visibility à une variable qui indique si elle doit être affichée ou non. Une fois que vous avez vérifié les droits de l'utilisateur, définissez cette variable de manière à masquer les onglets indésirables.

Une autre possibilité consiste à ajouter les vues aux régions après avoir vérifié les droits de l'utilisateur, au lieu d'enregistrer les vues avec les régions.

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

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