代码之家  ›  专栏  ›  技术社区  ›  Thies

如何基于用户角色操作WPF GUI

  •  8
  • Thies  · 技术社区  · 15 年前

    我正在使用.NET的IIdentity和IPrincipal对象来实现基于角色的安全性,并且我正在根据当前用户的角色修改显示的控件。

    这可以在XAML中完成吗,或者我必须用我认为有点混乱的代码将其抽象成代码;

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

    (注意:我的代码在执行函数时检查角色,我希望做的是根据角色修改GUI,这样用户就不会看到/看到他们无权访问的只读元素)

    2 回复  |  直到 12 年前
        1
  •  20
  •   Sergej Andrejev    14 年前

    虽然前面的答案是可行的,但对我来说,在逻辑对象中检测可见性看起来有点难看。我会用转换器。。。

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

    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();
        }
    }
    
        2
  •  1
  •   Will Eddins    15 年前
    <Control Visibility={Binding ElementName=ThisWindow, Path=AdministratorVisibility, Mode=OneWay}/>
    

    在您的C#代码中:

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

    你可以做同样的事情来实现一些东西 IsReadOnly . 如果用户的角色可以更改(我不确定这些用户角色如何工作),您可以实现 INotifyPropertyChanged NotifyPropertyChanged("AdministratorVisibility") ,否则您可能会更改 BindingMode BindingMode.OneTime 并跳过实现通知。

    这可能并不比你现在所做的好多少,但它可能和你将要得到的一样好。