2016-12-13 90 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

的方式去... :) –