Silverlight - 如何根据用户安全性显示元素

时间:2010-06-29 12:56:16

标签: silverlight

我是Silverlight的新手......

我想要一个页面根据当前用户安全角色显示元素(按钮,网格,图像)。基本上,我想附加一个元素所需的安全角色,并调用我的代码来决定元素是否显示。

类似(添加属性 RequiredRole

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

在这种情况下,如果用户没有足够的安全权限,我的代码会将Button.visibility设置为隐藏。

我在文档中找不到任何可能帮助我实现此类内容的DependentProperties。

如何做到这一点? (如果这是考虑这个问题的正确方法......)

感谢。

3 个答案:

答案 0 :(得分: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"/>

答案 1 :(得分:0)

一种方法是将按钮绑定到命令对象。在命令对象的“CanExecute”上,您将执行安全检查。当然,这只适用于按钮。

可能更有趣的方法是创建一个管理安全性的对象,并通过索引器提供安全值。您可以为与对象接口的元素可见性创建行为。然后,你会做类似的事情:

安全行为将接受附加按钮,查询安全系统,并在用户未获得授权时折叠可见性。

答案 2 :(得分: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;
        }
    }
}