Silverlight - как отобразить элемент на основе безопасности пользователя - PullRequest
2 голосов
/ 29 июня 2010

Я новичок Silverlight ...

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

Что-то вроде (добавление атрибута RequiredRole )

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

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

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

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

Спасибо.

Ответы [ 3 ]

1 голос
/ 29 июня 2010

У вас есть логика, чтобы определить роль пользователя и хотите соответственно изменить видимость?Похоже, вы уже на правильном пути.Как насчет присоединенного свойства ?Вы можете включить 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 голосов
/ 29 июня 2010

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

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;
        }
    }
}
0 голосов
/ 29 июня 2010

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

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

Поведение безопасности будет принимать кнопку при подключении, запросить систему безопасности и свернуть видимость, если пользователь не авторизован.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...