How to manipulate WPF GUI based on user roles

前端 未结 2 850
抹茶落季
抹茶落季 2020-12-13 16:15

I am using .NET\'s IIdentity and IPrincipal objects for role based security, and I am at the step of modifying controls shown based on roles the current user has.

My

相关标签:
2条回答
  • 2020-12-13 16:45

    Although previous answer will work, to me it looks little ugly to detect visibility in logic objects. I would use converter for that...

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

    And then the converter itself

    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 讨论(0)
  • 2020-12-13 17:08
    <Control Visibility={Binding ElementName=ThisWindow, Path=AdministratorVisibility, Mode=OneWay}/>
    

    In your C# code:

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

    You can do the same thing for implementing something for IsReadOnly. If the user's role can change (I'm not sure how these user roles work), you can implement INotifyPropertyChanged and do NotifyPropertyChanged("AdministratorVisibility"), otherwise you could probably change the BindingMode to BindingMode.OneTime and skip implementing the notifications.

    This probably isn't a whole lot better than what you're doing already, but it's probably as good as you're going to get.

    0 讨论(0)
提交回复
热议问题