我希望看看我是否可以在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的情况下更改只读角色可以看到/执行的操作。
有没有人知道这是否可能,如果是这样,最好的做法。
提前致谢。
诺尔
答案 0 :(得分:2)
我相信“在Xaml中没有完成”几乎是不可能的,除非您愿意为每个不同的权限创建不同的视图,并且在导航期间定位相应的用户权限页面。
否则......你能做的最好的事情就是创造一种风格。此样式将以基本控件为目标,并在定义内创建一个数据触发器,该触发器将打开/关闭visiblity或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>
答案 1 :(得分:1)
如果您使用的是MVVM,那么您的视图模型应具有public bool IsXXXAllowed { get; private set; }
等属性。在实例化视图模型时,您应该查询用户是否具有使用XXX功能所需的最低权限,并相应地设置属性的值。理想情况下,权限检查应该与角色无关,因为可以为嵌套等用户创建角色。您可以使用fn_my_permissions
直接查询表的权限。
然后在视图中,只需绑定相关控件的IsEnabled
属性(或Visibility
属性{或BooleanToVisibilityConverter
属性)(如果有更多,则绑定控件的Grid
而不是一个控件)到IsXXXAllowed
属性。