10

我正在使用 .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,因此用户看不到/看到他们无权访问的只读元素)

4

2 回答 2

20

尽管以前的答案会起作用,但对我来说,检测逻辑对象中的可见性看起来并不难看。我会为此使用转换器...

<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();
    }
}
于 2009-06-19T22:24:09.097 回答
1
<Control Visibility={Binding ElementName=ThisWindow, Path=AdministratorVisibility, Mode=OneWay}/>

在您的 C# 代码中:

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

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

这可能并不比你已经在做的好很多,但它可能和你将要得到的一样好。

于 2009-06-19T18:06:08.707 回答