Регистрация просмотров с регионами в зависимости от прав пользователя - PullRequest
3 голосов
/ 15 декабря 2010

У меня есть TabControl в качестве ItemControl, в котором расположен регион, назовем его ContentRegion. Несколько модулей регистрируют как минимум одно представление в ContentRegion. Но эти регистрации выполняются во время инициализации модуля.

Я хочу запретить регистрацию нескольких просмотров в зависимости от текущего пользователя. Но пользователь входит в систему после инициализации модуля и также может измениться во время выполнения.

Есть ли способ обеспечить обратный вызов, где призма может оценить, активна ли регистрация? Или у меня есть возможность отключить регистрации регионального менеджера? Есть другие идеи?

Ответы [ 2 ]

4 голосов
/ 15 декабря 2010

Ответ довольно прост: реализовать собственное поведение региона. Вам просто нужно извлечь из существующего 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 или только в определенных регионах. Как этого добиться, подробно описано в Приложении E документации Prism. Что я сделал, так это прикрепил поведение только к определенной области и заменил 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 голосов
/ 15 декабря 2010

Вы можете привязать TabItem.Visibility к переменной, которая указывает, следует ли ее показывать или нет.После того как вы проверили права пользователя, установите эту переменную так, чтобы она скрывала нежелательные вкладки.

Другой возможностью будет добавление представлений в регионы после проверки прав пользователей вместо регистрации представлений в регионах.

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