Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 如何使用枚举器控制XAML中的角色/权限_Wpf_Silverlight_Xaml_Enums_Permissions - Fatal编程技术网

Wpf 如何使用枚举器控制XAML中的角色/权限

Wpf 如何使用枚举器控制XAML中的角色/权限,wpf,silverlight,xaml,enums,permissions,Wpf,Silverlight,Xaml,Enums,Permissions,问题是我拥有权限而不是角色 我拥有数据库驱动的权限,我通过登录Silverlight应用程序为每个用户获取这些权限,并将其填入列表中。我还有一个C代码的枚举器 无论如何,我不想谈论我为什么不使用角色等 我想在XAML元素中键入我的权限,并在它们上设置可见性和IsEnabled 像这样: <Button IsEnabled="{Binding IsAdmin}" /> 首先是附加的依赖项属性: 使用系统; 使用System.Linq; 运用系统反思; 使用System.Windows

问题是我拥有权限而不是角色

我拥有数据库驱动的权限,我通过登录Silverlight应用程序为每个用户获取这些权限,并将其填入
列表中。我还有一个C代码的枚举器

无论如何,我不想谈论我为什么不使用角色等

我想在XAML元素中键入我的权限,并在它们上设置可见性和IsEnabled

像这样:

<Button IsEnabled="{Binding IsAdmin}" />

首先是附加的依赖项属性:

使用系统;
使用System.Linq;
运用系统反思;
使用System.Windows;
使用System.Windows.Controls;
//使用GalaSoft.MvvmLight//可选择的
名称空间SL.权限
{
公共枚举权限:短
{
ADMIN=1,//管理员
EDITOR=2,//EDITOR
USER=99//普通用户
}
公共类许可
{
#区域私有方法
私有静态void重新计算控制可见性(UIElement控件,bool hasPermission)
{
如果(已获得许可)
control.Visibility=可见性.Visibility;
其他的
control.Visibility=Visibility.Collapsed;
}
私有静态无效重新计算控件已启用(控件控件,bool hasPermission)
{
control.IsEnabled=hasPermission;
}
#端区
#区域可见性
公共静态只读从属属性VisibilityProperty=
DependencyProperty.RegisterAttached(“可见性”、typeof(字符串)、typeof(权限)、新属性元数据(可见性_回调));
私有静态void可见性\u回调(DependencyObject源、DependencyPropertyChangedEventArgs e)
{
bool hasPermission=false;
变量uiElement=(uiElement)源;
var permissions=GetVisibility(uiElement).Split(',');
EnumPermission permission=新建EnumPermission();
//如果使用MVVM light toolkit
//if(ViewModelBase.IsIndesignatic)
//{
//hasPermission=true;
//转到终点;
//}
//循环槽枚举器
foreach(permission.GetType().GetFields(BindingFlags.Static | BindingFlags.Public)中的var fieldInfo)
{
//环槽参数
foreach(permissions.Where(m=>m.ToUpper()==fieldInfo.Name.ToUpper())中的var项)
{
权限=(EnumPermission)Enum.Parse(permission.GetType(),fieldInfo.Name,false);
//hasPermission=HasUserPermission(permission);//检查此权限是否在用户权限列表中
hasPermission=true;//TODO:将您的代码放在此处以检查用户的权限
如果(已获得许可)转到结束;
}
}
转到终点;
完:
重新计算控制可见性(uiElement,hasPermission);
}
公共静态void SetVisibility(UIElement元素,字符串值)
{
元素设置值(VisibilityProperty,value);
}
公共静态字符串GetVisibility(UIElement)
{
返回(字符串)元素.GetValue(VisibilityProperty);
}
#端区
#区域被封锁
公共静态只读从属属性IsEnabledProperty=
DependencyProperty.RegisterAttached(“IsEnabled”、typeof(string)、typeof(Permission)、new PropertyMetadata(IsEnabled_回调));
私有静态void IsEnabled_回调(DependencyObject源,DependencyPropertyChangedEventArgs e)
{
bool hasPermission=false;
变量uiElement=(控制)源;
var permissions=GetIsEnabled(uiElement).Split(',');
EnumPermission permission=新建EnumPermission();
//如果使用MVVM light toolkit
//if(ViewModelBase.IsIndesignatic)
//{
//hasPermission=true;
//转到终点;
//}
//循环槽枚举器
foreach(permission.GetType().GetFields(BindingFlags.Static | BindingFlags.Public)中的var fieldInfo)
{
//环槽参数
foreach(permissions.Where(m=>m.ToUpper()==fieldInfo.Name.ToUpper())中的var项)
{
权限=(EnumPermission)Enum.Parse(permission.GetType(),fieldInfo.Name,false);
//hasPermission=HasUserPermission(permission);//检查此权限是否在用户权限列表中
hasPermission=true;//TODO:将您的代码放在此处以检查用户的权限
如果(已获得许可)转到结束;
}
}
转到终点;
完:
重新计算控制启用(uiElement,hasPermission);
}
公共静态void SetIsEnabled(UIElement元素,字符串值)
{
元素.SetValue(IsEnabledProperty,value);
}
公共静态字符串GetIsEnabled(UIElement)
{
返回(字符串)元素.GetValue(IsEnabledProperty);
}
#端区
}
}
XAML命名空间代码:

xmlns:permissions=“clr命名空间:SL.permissions”
XAML中的按钮:


因此,此按钮将仅对具有管理员或编辑器权限的用户启用


此按钮仅对具有管理员权限的用户可见

当然,您不仅限于在按钮上使用此选项

我对任何代码优化评论或关于此解决方案的一般评论持开放态度

待办事项:您必须实施自己的方法来检查用户是否有权限

我用我的方法
hasPermission=HasUserPermission(per