Como manipular WPF GUI baseado em funções de usuário
Pergunta
Eu estou usando IIdentity e IPrincipal de objetos .NET para a segurança baseada em função, e estou na etapa de modificar controles mostrados com base em funções o usuário atual tem.
A minha pergunta é o que o método recomendado é para ativar / desativar campos em uma janela WPF -. Mostrar / ocultar campos depende do tipo de chamadas IIdentity.IsInRole
Isso pode ser feito em XAML, ou eu tenho para o abstrato esta em código com o que eu acho que é uma bagunça pouco no código por trás;
this.txtUserName.IsReadOnly = !MyPrincipal.CurrentPrincipal.IsInRole("Administrator");
this.mnuCreateUser.Visibility = MyPrincipal.CurrentPrincipal.IsInRole("Administrator");
? Visibility.Hidden : Visibility.Visible;
(Nota: os meus código verifica papéis na execução das funções, o que estou procurando fazer é modificar a dependente dos papéis GUI, assim os usuários não ver / ver elementos somente leitura que eles não têm acesso a)
Solução
Embora resposta anterior vai funcionar, me parece pouco feio para detectar visibilidade em objetos lógicos. Gostaria de usar o conversor para isso ...
<Control Visibility={Binding Path=CurrentPrincipal, Converter={StaticResource RoleToVisibilityConverter}, ConverterParameter=Administrator}/>
E então o próprio conversor
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();
}
}
Outras dicas
<Control Visibility={Binding ElementName=ThisWindow, Path=AdministratorVisibility, Mode=OneWay}/>
Em seu código C #:
public Visibility AdministratorVisibility
{
get
{
MyPrincipal.CurrentPrincipal.IsInRole("Administrator") ? Visibility.Hidden : Visibility.Visible;
}
}
Você pode fazer a mesma coisa para implementar algo para IsReadOnly
. Se a função do usuário pode mudar (não tenho a certeza como essas funções de usuário de trabalho), você pode implementar INotifyPropertyChanged
e fazer NotifyPropertyChanged("AdministratorVisibility")
, caso contrário, você provavelmente poderia mudar o BindingMode
para BindingMode.OneTime
e pular implementação das notificações.
Esta provavelmente não é muito melhor do que o que você já está fazendo, mas é provavelmente tão bom como você vai conseguir.