2016-12-13 43 views
0

我有一个WPF桌面应用程序。使用绑定设置用户权限的更好方法

我也使用sql lite来存储表/值。

其中一个表是用户权限角色。

所以..当用户登录代码将获得他们有权使用的角色列表。

然后我通过每条记录来设置按钮(ie)是否已启用。

在我的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 
    } 
} 

,然后在我看来,(S)这样的事情...

<Button name="CanDelete "IsEnabled="{Binding UserPermissions.CanDelete}" /> 
<Button name="CanAdd "IsEnabled="{Binding UserPermissions.CanAdd}" /> 

     ....etc etc etc 

这一切运作良好。但展望未来,我可以看到增加的功能,因此设置了用户角色/权限。

因此,当我需要时,我应该考虑另一个范例或硬代码更改吗?或者有没有办法从我的数据库表中驱动这个?

我只问这个问题,因为我相对较新的WPF和绑定,所以想知道是否有一些聪明的选择?

+0

我并不真正做WPF但是从纯粹的OOP的角度来看,我会创建用于按钮(或甚至对照)一个基类,具有内置的逻辑来消耗无论您拥有什么安全方案,并根据此设置自己的启用状态。 – JuanR

+0

@Juan嗨,感谢您的回复。是的,这是我会考虑的替代方案之一,但我想看看我是否可以使它与wpf绑定一起工作。就像一个绑定数组例如..如果我做了,我将需要在代码中设置绑定,我不知道是否是正确的方式去 –

回答

0

您是否曾经在运行时更改权限?
我不知道UserPermissions是什么。但如果它不是一个领域,而是一个静态类,那么你可能会遇到麻烦。由于WPF不能真正确定属性是否已经改变,如果它是一个静态属性。但事实上,你的约束不是x:static所以我认为它是一个属性。这很好。

除此之外,由于所有ViewModel都可以访问UserPermissions实例,因此绑定将与当前结构配合良好。

我还建议查看RelayCommand并移动CanExecute并在视图模型中单击操作。这样,您将能够放置更多逻辑来确定是否在没有转换器的情况下启用按钮。

+0

嗨史蒂夫,谢谢你的回答。我的继电器命令和可执行功能已经在我的ViewModel中。是的,我知道WPF有静态属性的问题,是的你观察我正在使用属性是正确的。我不确定你的建议与我正在做的事情不同,非常感谢:) –

+1

@AndrewSimpson然后你可以移动IsEnabled绑定到CanExecute参数 – Steve

+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"; 
} 
+0

谢谢迈克尔这与我正在考虑的类似。谢谢 –

+0

我只是会给予一点,但在接受之前,只是在有一个替代.. –

+0

的方式去... :) –