Как управлять графическим интерфейсом WPF на основе ролей пользователей

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

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

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

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

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

2 ответов


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

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

<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 to BindingMode.OneTime и пропустить реализацию уведомлений.

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