Как управлять графическим интерфейсом 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
и пропустить реализацию уведомлений.
это, вероятно, не намного лучше, чем то, что вы уже делаете, но это, наверное, так хорошо, как вы собираетесь получить.