2016-12-13 2 views
0

У меня есть приложение для рабочего стола 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

Я не делать WPF, но с чисто объектно-ориентированной точки зрения, я хотел бы создать базовый класс для кнопок (или даже управления), который имеет встроенную логику, чтобы потреблять независимо от того, какая схема безопасности у вас есть, и на основе этого установите свой статус включения. – JuanR

+0

@Juan Привет, спасибо, что ответили. Да, это была одна из альтернатив, которые я бы рассмотрел, но я хотел посмотреть, могу ли я заставить ее работать с привязками wpf. Как, например, массив привязки .. Что бы я сделал, мне нужно было бы установить привязки в коде, который я не уверен, что это правильный путь. –

ответ

0

Вы когда-нибудь собираетесь изменить разрешение во время выполнения?
Я не знаю, что UserPermissions есть. но если это не поле, а статический класс, вы можете столкнуться с этой проблемой. Поскольку WPF can not действительно определяет, изменилось ли свойство или нет, если это статическое свойство. Но тот факт, что ваша привязка не x:static, поэтому я предполагаю, что это свойство. Это нормально.

кроме того, что привязка будет хорошо работать с вашей текущей структурой, учитывая, что все ViewModels имеют доступ к экземпляру UserPermissions.

Я бы также рекомендовал посмотреть в RelayCommand и переместить CanExecute и нажать действие в модели представления. Таким образом, вы сможете ввести больше логики, чтобы определить, следует ли включать кнопку без конвертера.

+0

Привет, Стив, спасибо за ваш ответ. Моя команда Relay и Can Execute уже находятся в моей модели ViewModel. Да, я знаю, что у WPF есть проблемы со свойствами Static, и да, вы правы в наблюдении, я использую свойства. Я не уверен, что ваше предложение отличается от того, что я делаю?Большое спасибо :) –

+1

@AndrewSimpson, тогда вы можете переместить привязку IsEnabled в параметр CanExecute – Steve

+0

steve, да это один из вариантов, который я рассматривал, я хотел посмотреть, что мои коллеги предложили бы поэтому мой вопрос, так что спасибо –

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

способ пойти ... :) –

Смежные вопросы