我有一个WPF桌面应用程序。
我也使用sql lite来存储表/值。
其中一个表是用户权限角色。
所以..当用户登录代码时,将获得他们有权使用的角色列表。
然后我通过每条记录来设置按钮(即)是否已启用。
所以在我的ViewModel中......
var myUserRoles = DB.CallMyMethodToReturnPermissions(User.Id);
foreach (role in myUserRoles)
{
switch (role.Name)
{
case "CanDelete"
if (role.Enabled)
{
UserPermissions.CanDelete = true;
}
break;
case "CanAdd"
if (role.Enabled)
{
UserPermissions.CanAdd = true;
}
break;
....etc etc etc
}
}
然后在我的视图中这样......
<Button name="CanDelete "IsEnabled="{Binding UserPermissions.CanDelete}" />
<Button name="CanAdd "IsEnabled="{Binding UserPermissions.CanAdd}" />
....etc etc etc
这一切都运作良好。但展望未来,我可以看到添加的功能,因此设置了用户角色/权限。
因此,我是否应该在需要时考虑另一种范例或硬代码更改?或者有没有办法从我的数据库表中驱动它?
我只问这个问题,因为我对WPF和绑定相对较新,所以想知道是否有一些聪明的选择?
答案 0 :(得分:2)
您可以创建自己的ICommand实现。
草稿示例:
public class PermissionRequiredCommand : ICommand
{
public event EventHandler CanExecuteChanged;
public PermissionRequiredCommand(string role,
Action onExecute,
Action<bool> canExecute,
Func<string, bool> hasPermission)
{
// bla bla
}
public void Execute(object parameter)
{
onExecute();
}
public bool CanExecute()
{
return canExecute() & hasPermission(role);
}
}
public class ViewModel
{
public ICommand Delete {get;}
public ViewModel(Authenticator authenticator)
{
Delete = new RequiresPermissionCommand(Roles.Delete,
Delete,
CanDelete,
roleName => authenticator.HasPermission(roleName));
}
}
public static class Roles
{
public const string Delete = "CanDelete";
}
答案 1 :(得分:0)
您是否会在运行时更改权限?
我不知道UserPermissions
是什么。但如果它不是一个字段而是一个静态类,那么你可能会遇到麻烦。由于WPF无法确定属性是否已更改(如果它是静态属性)。但是你的绑定不是x:static
,所以我认为它是一个属性。哪个好。
除此之外,鉴于所有ViewModel都可以访问UserPermissions
实例,绑定将与您当前的结构配合良好。
我还建议您查看RelayCommand并在视图模型中移动CanExecute
并单击操作。这样您就可以使用更多逻辑来确定是否在没有转换器的情况下启用按钮。