2009-06-19 9 views
8

Estoy utilizando los objetos IIdentity e IPrincipal de .NET para la seguridad basada en roles, y estoy en el paso de modificar los controles que se muestran en función de las funciones que tiene el usuario actual.Cómo manipular la GUI de WPF en función de los roles de usuario

Mi pregunta es cuál es el método recomendado para habilitar/deshabilitar campos en una ventana de WPF: mostrar/ocultar campos dependientes de las llamadas de tipo IIdentity.IsInRole.

¿Esto se puede hacer en XAML, o tengo que abstraer esto en código con lo que creo que es un poco complicado en el código subyacente;

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

(Nota; mis papeles Código de los controles durante la ejecución de funciones, lo que estoy buscando que hacer es modificar dependiente de la interfaz gráfica de usuario en las funciones, por lo que los usuarios no ven/ver los elementos de sólo lectura que no tienen acceso a)

Respuesta

15

Aunque la respuesta anterior funcionará, a mí me parece poco feo detectar visibilidad en objetos lógicos. Me gustaría utilizar convertidor para que ...

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

y luego el propio convertidor

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

Ahh, esto es muy de mi gusto. Con esto en el XAML debería ser sencillo ver el acceso que se requiere para ver los diferentes elementos en la GUI. Gracias. – Thies

+0

Sea bienvenido –

+0

código compañeros swipers, es posible que deba agregar "retorno" antes de "new NotImplementedException();" – SteveCav

1
<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 la función 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, probablemente podría cambiar el BindingMode al BindingMode.OneTime y omitir la implementación de las notificaciones.

Esto probablemente no sea mucho mejor de lo que ya está haciendo, pero es probable que sea tan bueno como lo que va a obtener.

+0

Gracias por la respuesta. Los roles que estoy usando solo se actualizan al cerrar y volver a abrir la aplicación, por lo que NotifyPropertyChange no es crítico. Pensé en este método, pero esperaba que existiera algo más directo, al igual que la sintaxis del atributo de rol que uno puede usar en los métodos. – Thies

Cuestiones relacionadas