2010-06-29 2 views
2

Я Silverlight новичка ...Silverlight - как отобразить элемент на основе безопасности пользователя

Я хочу, чтобы отобразить страницу элементов (кнопки, сетки, изображения) на основе текущей роли безопасности пользователя. В принципе, я хотел бы привязать элемент к требуемой роли безопасности и вызвать мой код, чтобы решить, будет ли элемент отображаться или нет.

Нечто подобное (добавление атрибута RequiredRole)

<Button RequiredRole="Administrator" x:Name="PushBtn" Content="PushMe"/> 

В этом случае мой код будет установить Button.visibility на скрытый, если пользователь не имеет достаточных прав безопасности.

Я не мог найти что-либо в документации (кроме, возможно, DependentProperties), которая могла бы помочь мне достичь чего-то подобного.

Как это можно сделать? (Если это совсем правильный способ подумать об этой проблеме ...)

Спасибо.

ответ

0

Одним из подходов было бы привязать кнопку к объекту команды. На «CanExecute» объекта команды вы выполните проверку безопасности. Это, конечно, будет работать только для кнопок.

Возможно, более интересный подход заключается в создании объекта, который управляет вашей безопасностью, и предоставляет значения безопасности с помощью индексатора. Вы можете создать поведение для видимости элемента, которая взаимодействует с объектом. Тогда вы могли бы сделать что-то вроде:

Поведение безопасности будет принимать в кнопку на приложенный запрос к системе безопасности, и разрушаться видимость, если пользователь не авторизован.

+0

ли это не сделать фактическое значение, которое было связано с элементом, по-прежнему доступны для отладочных инструментов, как SilverlightSpy? Это может быть не то, что вы хотите, когда речь заходит о защите вашего GUI. –

0

Рекурсивно перечислить все элементы управления в данной форме и соответственно установить их видимость. Вы можете поместить эту логику в вспомогательный или базовый класс.

public partial class MainPage : UserControl 
{ 
    public MainPage() 
    { 
     InitializeComponent(); 

     foreach (var control in LayoutRoot.GetVisuals().OfType<Control>()) 
      control.Visibility = Visibility.Collapsed; 
    } 
} 

public static class ExtensionMethods 
{ 
    public static IEnumerable<DependencyObject> GetVisuals(this DependencyObject root) 
    { 
     int count = VisualTreeHelper.GetChildrenCount(root); 

     for (int i = 0; i < count; i++) 
     { 
      var child = VisualTreeHelper.GetChild(root, i); 
      yield return child; 

      foreach (var descendants in child.GetVisuals()) 
       yield return descendants; 
     } 
    } 
} 
1

У вас есть логика, чтобы определить роль пользователя и, соответственно, искать видимость видимости? Похоже, ты уже на правильном пути. Как насчет attached property? Вы можете включить PropertyChangedCallback при определении метаданных свойств. Этот метод PropertyChangedCallback может обрабатывать видимость.

Вот основная идея ...

public static class RequiredRoleSupport 
{ 
    public static readonly DependencyProperty RequiredRoleProperty = DependencyProperty.RegisterAttached("RequiredRole", typeof(string), typeof(RequiredRoleSupport), new PropertyMetadata(ValidateRole)); 

    public static string GetRequiredRole(DependencyObject obj) 
    { 
     return (string)obj.GetValue(RequiredRoleProperty); 
    } 

    public static void SetRequiredRole(DependencyObject obj, string value) 
    { 
     obj.SetValue(RequiredRoleProperty, value); 
    } 

    private static void ValidateRole(object sender, DependencyPropertyChangedEventArgs e) 
    { 
     var control = sender as Control; 
     var roleValue = (string)e.NewValue; 

     // Logic to check roleValue against current user role and modify control accordingly 
    } 
} 

XAML

<UserControl xmlns:roleSupport=... 

<Button roleSupport:RequiredRoleSupport.RequiredRole="Administrator" x:Name="PushBtn" Content="PushMe"/> 
+0

Спасибо - это тип идеи, которую я имел в виду, но мне не хватало деталей. Я попробую это. – RenR

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