Как манипулировать WPF GUI на основе пользовательских ролей - PullRequest
8 голосов
/ 19 июня 2009

Я использую объекты .NET IIdentity и IPrincipal для безопасности на основе ролей, и я нахожусь на этапе изменения элементов управления, отображаемых на основе ролей, которые есть у текущего пользователя.

Мой вопрос заключается в том, какой метод рекомендуется использовать для включения / выключения полей в окне WPF - показ / скрытие полей в зависимости от вызовов типа IIdentity.IsInRole.

Может ли это быть сделано в XAML, или мне нужно абстрагировать это в код с тем, что, я думаю, немного запутано в коде позади;

this.txtUserName.IsReadOnly = !MyPrincipal.CurrentPrincipal.IsInRole("Administrator");
this.mnuCreateUser.Visibility = MyPrincipal.CurrentPrincipal.IsInRole("Administrator");
 ? Visibility.Hidden : Visibility.Visible;

(Примечание; мой код проверяет роли при выполнении функций, я хочу изменить GUI в зависимости от ролей, чтобы пользователи не видели / не видели элементы только для чтения, к которым у них нет доступа)

Ответы [ 2 ]

16 голосов
/ 20 июня 2009

Хотя предыдущий ответ будет работать, мне кажется немного уродливым обнаруживать видимость в логических объектах. Я бы использовал конвертер для этого ...

<Control Visibility={Binding Path=CurrentPrincipal, Converter={StaticResource RoleToVisibilityConverter}, ConverterParameter=Administrator}/>

А потом сам преобразователь

public class RoleToVisibilityConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var principal = value as Principal;
        if(principal != null) {
            return principal.IsInRole((string)parameter) ? Visibility.Visible : Visibility.Collapsed;
        }

        return null;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
         throw new NotImplementedException();
    }
}
1 голос
/ 19 июня 2009
<Control Visibility={Binding ElementName=ThisWindow, Path=AdministratorVisibility, Mode=OneWay}/>

В вашем коде C #:

public Visibility AdministratorVisibility
{
    get 
    { 
        MyPrincipal.CurrentPrincipal.IsInRole("Administrator") ? Visibility.Hidden : Visibility.Visible; 
    }
}

Вы можете сделать то же самое для реализации чего-либо для IsReadOnly.Если роль пользователя может измениться (я не уверен, как работают эти роли пользователя), вы можете реализовать INotifyPropertyChanged и сделать NotifyPropertyChanged("AdministratorVisibility"), в противном случае вы могли бы изменить BindingMode на BindingMode.OneTime и пропустить реализацию уведомлений.

Это, вероятно, не намного лучше, чем то, что вы уже делаете, но, вероятно, так же хорошо, как вы собираетесь получить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...