Пользовательское свойство XAML - PullRequest
2 голосов
/ 12 февраля 2011

Я видел библиотеку, которая позволяет мне делать это внутри моего XAML, который устанавливает видимость элемента управления в зависимости от того, находится ли пользователь в роли: s: Authorization.RequiresRole = "Admin"

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

Я получил роль аутентифицированных пользователей от моего SPROC, и в настоящее время она хранится в моем App.xaml.cs как свойство (не обязательно для окончательного решения, простоК вашему сведению).Я хочу создать свойство (свойство зависимостей «присоединенное свойство»), которое позволит мне сказать нечто очень похожее на то, что есть в другой библиотеке: requireRole = "Admin", что приведет к сбою видимости, если пользователь не находится в роли администратора.Кто-нибудь может указать мне правильное направление на это?

EDIT После создания класса авторизации я получаю следующую ошибку: «Свойство RequiredRole не существует для типа« HyperlinkButton »'в пространстве имен XML clr-namespace: TSMVVM.Authorization "

Я пытаюсь добавить этот xaml:

<HyperlinkButton x:Name="lnkSiteParameterDefinitions" 
        Style="{StaticResource LinkStyle}" 
                                  Tag="SiteParameterDefinitions" 
        Content="Site Parameter Definitions" 
        Command="{Binding NavigateCommand}"
        s:Authorization.RequiredRole="Admin"
        CommandParameter="{Binding Tag, ElementName=lnkSiteParameterDefinitions}"/>

Когда я начал вводить s: Authorization.RequiredRole =" Admin", Intellisense поднял его.Я попытался установить typeof (string) и typeof (ownerclass) в HyperlinkButton, чтобы посмотреть, поможет ли это, но это не помогло.Есть мысли?

1 Ответ

4 голосов
/ 12 февраля 2011

Прикрепленное свойство - способ его реализации.Вы должны определить свойство следующим образом:

public class Authorization
{
    #region Attached DP registration

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

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

    #endregion

    // Using a DependencyProperty as the backing store for RequiredRole.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty RequiredRoleProperty =
        DependencyProperty.RegisterAttached("RequiredRole", typeof(string), typeof(Authorization), new PropertyMetadata(RequiredRole_Callback));

    // This callback will be invoked when some control will receive a value for your 'RequiredRole' property
    private static void RequiredRole_Callback(DependencyObject source, DependencyPropertyChangedEventArgs e)
    {
        var uiElement = (UIElement) source;
        RecalculateControlVisibility(uiElement);

        // also this class should subscribe somehow to role changes and update all control's visibility after role being changed
    }

    private static void RecalculateControlVisibility(UIElement control)
    {
        //Authorization.UserHasRole() - is your code to check roles
        if (Authentication.UserHasRole(GetRequiredRole(control)))
            control.Visibility = Visibility.Visible;
        else 
            control.Visibility = Visibility.Collapsed;
    }
}

PS: слишком поздно заметили, что вы спрашиваете о Silverlight.Хотя я верю, что он работает там точно так же, но я пробовал это только на WPF.

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