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)

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top