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)

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top