2016-12-13 8 views
0

Ich habe eine WPF-Desktop-App.Eine bessere Möglichkeit, Benutzerberechtigungen für Elemente festzulegen, die Bindungen verwenden

Ich benutze auch sql lite um Tabellen/Werte zu speichern.

Eine dieser Tabellen ist Benutzerberechtigungsrollen.

Also ... wenn ein Benutzer sich anmeldet, bekommt der Code eine Liste von Rollen, die er benutzen darf.

Ich gehe dann durch jeden Datensatz, um festzulegen, ob die Schaltfläche (dh) für dann aktiviert ist oder nicht.

so in meinem 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 
    } 
} 

und dann in meiner Ansicht (n) so etwas wie dieses ...

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

     ....etc etc etc 

das funktioniert gut All. Aber mit Blick in die Zukunft kann ich zusätzliche Funktionalität sehen und daher Benutzerrollen/Berechtigungen gesetzt werden.

Daher, sollte ich ein anderes Paradigma oder harten Code Änderungen, wenn ich muss? Oder gibt es eine Möglichkeit, dies von meinem DB-Tisch zu fahren?

Ich frage nur diese Frage, weil ich relativ neu zu WPF und Bindings bin, also fragte mich, ob es einige clevere Alternativen gibt?

+0

Ich weiß nicht wirklich WPF tun, sondern aus rein OOP Standpunkt, würde ich eine Basisklasse für Knöpfe (oder sogar Kontrollen) erstellen, das hat eingebaute Logik zu konsumieren welches Sicherheitsschema Sie auch haben und legen Sie einen eigenen Aktivierungsstatus fest. – JuanR

+0

@Juan Hallo, danke für die Antwort. Ja, das war eine der Alternativen, die ich in Erwägung gezogen hätte, aber ich wollte sehen, ob ich es mit wpf Bindings arbeiten lassen könnte. Wie ein bindendes Array zum Beispiel .. Was, wenn ich tat, ich würde Bindungen in t den Code setzen, die ich nicht sicher bin, ist der richtige Weg –

Antwort

0

Werden Sie jemals die Berechtigung während der Laufzeit ändern?
Ich weiß nicht, was UserPermissions ist. Wenn es sich jedoch nicht um ein Feld, sondern um eine statische Klasse handelt, könnte es zu Problemen kommen. Seit WPF kann nicht wirklich feststellen, ob die Eigenschaft geändert hat oder nicht, wenn es eine statische Eigenschaft ist. Aber die Tatsache, dass Ihre Bindung nicht x:static ist, so nehme ich an, es ist eine Eigenschaft. Was ist in Ordnung.

anderen als die Bindung funktioniert gut mit Ihrer aktuellen Struktur, da alle ViewModels Zugriff auf die UserPermissions Instanz hat.

Ich würde auch empfehlen, in RelayCommand suchen und verschieben Sie die CanExecute und klicken Sie auf Aktion im Ansichtsmodell. Auf diese Weise können Sie mehr Logik verwenden, um zu bestimmen, ob die Schaltfläche ohne Konverter aktiviert werden soll.

+0

Hallo Steve, danke für Ihre Antwort. My Relaycommand und Can Execute sind bereits in meinem ViewModel. Ja, ich weiß, dass WPF Probleme mit statischen Eigenschaften hat, und ja, Sie haben recht, wenn ich beobachte, dass ich Eigenschaften verwende. Ich bin mir nicht sicher, was Ihr Vorschlag ist, abgesehen davon, was ich mache?Vielen Dank :) –

+1

@AndrewSimpson dann können Sie die IsEnabled Bindung in CanExecute Parameter – Steve

+0

steve, ja es ist eine der Optionen, die ich in Erwägung gezogen, wollte ich sehen, was meine Kollegen vorschlagen würde daher meine Frage so danke –

2

Sie könnten Ihre eigene Implementierung von ICommand erstellen.

Entwurf Beispiel:

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

Danke Michael das war ähnlich zu dem, was ich in Erwägung zog. Danke –

+0

Ich werde nur ein wenig geben, aber bevor ich akzeptiere nur für den Fall, dass es eine Alternative gibt .. –

+0

der Weg zu gehen ... :) –

Verwandte Themen