2

我看到一个库允许我在我的 XAML 中执行此操作,它根据用户是否处于角色中来设置控件的可见性:s:Authorization.RequiresRole="Admin"

将那个库与我的数据库一起使用需要一堆我现在无法真正做到的编码。最终这就是我想知道的......

我从我的 SPROC 收到了经过身份验证的用户角色,它当前作为属性存储在我的 App.xaml.cs 中(对于最终解决方案来说不是必需的,现在仅供参考)。我想创建一个属性(依赖属性?附加属性?),它允许我说一些与其他库非常相似的内容:RequiresRole="Admin",如果用户不是管理员角色,它会折叠可见性。谁能指出我正确的方向?

编辑 构建授权类后,我收到以下错误:“XML 命名空间 clr-namespace:TSMVVM.Authorization 中的类型 'HyperlinkBut​​ton' 上不存在属性 'RequiredRole'”

我正在尝试添加这个 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" 时,智能感知将其拾取。我尝试将 typeof(string) 和 typeof(ownerclass) 设置为 HyperlinkBut​​ton 以查看是否有帮助,但没有。有什么想法吗?

4

1 回答 1

4

附加属性是实现它的方式。您应该像这样定义一个属性:

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 上尝试过。

于 2011-02-11T23:42:06.110 回答