我使用.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依赖于角色,因此用户不会看到/看只读元素,他们没有获得注)
虽然前面的答案将工作,对我来说,它看起来有点丑陋检测逻辑对象的知名度。 我会用转换为...
<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();
}
}
<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
并跳过执行通知。
这可能不是比你在做什么,已经好了一大堆,但它可能不如你会得到什么。