Question

J'utilise les objets IIdentity et IPrincipal .NET pour la sécurité basée sur les rôles, et je suis en train de modifier les contrôles affichés en fonction des rôles de l'utilisateur actuel.

Ma question est la suivante: quelle est la méthode recommandée pour activer / désactiver les champs dans une fenêtre WPF - afficher / masquer les champs en fonction d'appels de type IIdentity.IsInRole.

Cela peut-il être fait en XAML, ou dois-je résumer cela en code avec ce que je pense être un peu brouillon dans le code derrière;

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

(Remarque: mon code vérifie les rôles lors de l'exécution de fonctions. Ce que je cherche à faire, c'est de modifier l'interface graphique en fonction des rôles, afin que les utilisateurs ne voient pas / ne voient pas en lecture les éléments auxquels ils n'ont pas accès.)

Était-ce utile?

La solution

Bien que la réponse précédente fonctionne, il me semble peu moche de détecter la visibilité dans des objets logiques. J'utiliserais un convertisseur pour ça ...

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

Et puis le convertisseur lui-même

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

Autres conseils

<Control Visibility={Binding ElementName=ThisWindow, Path=AdministratorVisibility, Mode=OneWay}/>

Dans votre code C #:

public Visibility AdministratorVisibility
{
    get 
    { 
        MyPrincipal.CurrentPrincipal.IsInRole("Administrator") ? Visibility.Hidden : Visibility.Visible; 
    }
}

Vous pouvez faire la même chose pour implémenter quelque chose pour IsReadOnly . Si le rôle de l'utilisateur peut changer (je ne suis pas sûr du fonctionnement de ces rôles), vous pouvez implémenter INotifyPropertyChanged et faire NotifyPropertyChanged (" AdministrateurVisibility ") , sinon vous pourriez remplacez probablement BindingMode par BindingMode.OneTime et ignorez la mise en œuvre des notifications.

Ce n'est probablement pas beaucoup mieux que ce que vous faites déjà, mais c'est probablement aussi bon que vous allez en obtenir.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top