如何根据用户角色操作WPF GUI

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

我的问题是推荐的方法是在WPF窗口中启用/禁用字段 – 显示/隐藏依赖于IIdentity.IsInRole类型调用的字段。

这可以在XAML中完成,还是我必须将其抽象为代码,我认为后面的代码有点混乱;

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

(注意;我的代码在执行函数时检查角色,我要做的是根据角色修改GUI,因此用户看不到/看到他们无权访问的只读元素)

虽然以前的答案是有效的,但对我来说,检测逻辑对象的可见性看起来很难看。 我会用转换器…

  

然后是转换器本身

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

在您的C#代码中:

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

您可以为IsReadOnly实现相同的function。 如果用户的角色可以更改(我不确定这些用户角色是如何工作的),您可以实现INotifyPropertyChanged并执行NotifyPropertyChanged("AdministratorVisibility") ,否则您可能BindingMode BindingMode.OneTime更改为BindingMode.OneTime并跳过实现通知。

这可能并不比你已经做的好多了,但它可能和你想要的一样好。