Cómo manipular la GUI de WPF en función de los roles de usuario
Pregunta
Estoy usando los objetos IIdentity e IPrincipal de .NET para la seguridad basada en roles, y estoy en el paso de modificar los controles mostrados en función de los roles que tiene el usuario actual.
Mi pregunta es cuál es el método recomendado para habilitar / deshabilitar campos en una ventana WPF: mostrar / ocultar campos dependientes de llamadas de tipo IIdentity.IsInRole.
¿Se puede hacer esto en XAML, o tengo que resumir esto en código con lo que creo que es un poco desordenado en el código que se encuentra detrás?
this.txtUserName.IsReadOnly = !MyPrincipal.CurrentPrincipal.IsInRole("Administrator");
this.mnuCreateUser.Visibility = MyPrincipal.CurrentPrincipal.IsInRole("Administrator");
? Visibility.Hidden : Visibility.Visible;
(Nota; mi código verifica los roles cuando ejecuto funciones, lo que estoy buscando hacer es modificar la GUI que depende de los roles, para que los usuarios no vean / vean elementos de solo lectura a los que no tienen acceso)
Solución
Aunque la respuesta anterior funcionará, para mí parece poco feo detectar la visibilidad en los objetos lógicos. Yo usaría convertidor para eso ...
<Control Visibility={Binding Path=CurrentPrincipal, Converter={StaticResource RoleToVisibilityConverter}, ConverterParameter=Administrator}/>
Y luego el convertidor mismo
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();
}
}
Otros consejos
<Control Visibility={Binding ElementName=ThisWindow, Path=AdministratorVisibility, Mode=OneWay}/>
En su código C #:
public Visibility AdministratorVisibility
{
get
{
MyPrincipal.CurrentPrincipal.IsInRole("Administrator") ? Visibility.Hidden : Visibility.Visible;
}
}
Puede hacer lo mismo para implementar algo para IsReadOnly
. Si el rol del usuario puede cambiar (no estoy seguro de cómo funcionan estos roles de usuario), puede implementar INotifyPropertyChanged
y hacer NotifyPropertyChanged (" AdministratorVisibility ")
, de lo contrario, podría probablemente cambie BindingMode
a BindingMode.OneTime
y omita la implementación de las notificaciones.
Esto probablemente no sea mucho mejor de lo que ya estás haciendo, pero probablemente sea tan bueno como lo que vas a obtener.