1

我正在寻找是否可以在 WPF 中执行以下操作:

用户打开 WPF 应用程序并使用用户 AD 名称,我将检查自定义数据库中的用户角色。这将类似于 asp.net 会员数据库。

根据用户角色,WPF 将显示某些控件。

例如,如果我是管理员,那么我可以访问所有内容,但如果我是只读用户,那么我对应用程序的访问权限将受到限制。

我知道我可以使用以下示例设置可见性:

public class RoleToVisibilityConverter : MarkupExtension,IValueConverter
{
    public RoleToVisibilityConverter()
    {

    }

    public object Convert(object value, Type targetType, object parameter, CultureInfo                                 culture)
    {
        var principal = value as GenericPrincipal;
        bool IsValidUser = false;
        if (principal != null)
        {
            foreach (String role in parameter.ToString().Split(';'))
            {
                if (principal.IsInRole(role))
                {
                    IsValidUser = true;
                    break;
                }  
            }
            return IsValidUser ? Visibility.Visible : Visibility.Collapsed;
        }

        return null;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        return this;
    }
}

在 XAML 中,我为 Visibility 添加了以下绑定:

Visibility="{Binding Source={x:Static systhread:Thread.CurrentPrincipal}, ConverterParameter=admin;editor;readonly, Converter={rv:RoleToVisibilityConverter}}

但我想做的是不必在 xaml 中添加它。

我希望能够获得用户角色及其所有权限,并根据窗口加载 UI 权限。

原因是我希望能够更改只读角色可以看到/执行的操作,而无需更改 xaml。

有谁知道这是否可行,如果可以,这是最佳做法。

提前致谢。

诺埃尔

4

2 回答 2

2

我相信“未在 Xaml 中完成”实际上是不可能的,除非您愿意为每个不同的权限创建不同的视图,并且在导航期间以适当的用户权限页面为目标。

否则……你能做的最好的事情就是创造一种风格。此样式将针对基本控件并在定义中创建一个数据触发器,该触发器将打开/关闭可见性或 IsEnabled 或两者。这样,该样式可以位于所有 xaml 页面的一个中心位置,并且每个需要权限标记的控件都可以通过简单地遵循该样式来获得它。

这样做的另一个好处是您可以根据需要绑定不同的场景。例如,以下样式在数据上下文中设置了不同的布尔值。一个人可能可以查看但不能编辑,因此该用户的 IsEnabled 设置为 false,而管理员将被允许同时执行这两项操作,而不可查看的标记用户甚至看不到控件。

<Style x:Key="PermissionStyle" TargetType="{x:Type Control}">
    <Style.Triggers>
        <DataTrigger Binding="{Binding Path=ViewOnly}" Value="True">
            <Setter Property="Visibility" Value="Visible" />
            <Setter Property="IsEnabled" Value="False" />
        </DataTrigger>
        <DataTrigger Binding="{Binding Path=IsAdmin}" Value="True">
            <Setter Property="IsEnabled" Value="True" />
            <Setter Property="Visibility" Value="Visible" />
        </DataTrigger>
        <DataTrigger Binding="{Binding Path=NotVisible}" Value="True">
            <Setter Property="IsEnabled" Value="False" />
            <Setter Property="Visibility" Value="Hidden" />
        </DataTrigger>            
    </Style.Triggers>
</Style> 
于 2013-01-10T13:16:13.260 回答
1

如果您使用的是 MVVM,那么您的视图模型应该具有诸如public bool IsXXXAllowed { get; private set; }. 实例化视图模型时,您应该查询用户是否具有使用 XXX 功能所需的最低权限并相应地设置属性的值。理想情况下,权限检查应该与角色无关,因为可以为嵌套等用户创建角色。您可以使用fn_my_permissions.

然后在视图中简单地将相关控件的IsEnabled属性(或Visibility使用属性)绑定到属性(如果有多个控件,则为封闭控件)。BooleanToVisibilityConverterGridIsXXXAllowed

于 2013-05-28T07:50:11.867 回答