2010-12-15 7 views
3

リージョンをホストするItemControlとしてTabControlを持っています。これをContentRegionと呼ぶことにします。いくつかのモジュールは少なくとも1つのビューを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

2番目のアプローチはモジュール性プリンシパルです。各ビューを知っているコンポーネントがないため、ビューはリージョンに登録されます。したがって、初期化後にコンポーネントをトリガーして、リージョン内に追加する(または登録しない)ことはできません。 – PVitt

関連する問題