2010-06-29 84 views
2

我是一个Silverlight新手显示元素...Silverlight的 - 如何基于用户安全

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

喜欢的东西(添加属性RequiredRole

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

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

我找不到任何文件(除了可能DependentProperties),可以帮助我实现这样的事情。

这怎么办? (如果这是所有正确的方式来考虑这个问题...)

谢谢。

回答

0

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

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

的安全行为将采取在按钮上附着,查询保障体系,崩溃的知名度,如果用户没有被授权。

+0

不这样做的实际价值,这是必然的元素,仍然可以使用调试工具,如SilverlightSpy?这可能不是您想要保护您的GUI时想要的。 – 2011-06-06 09:24:05

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 2010-06-29 20:53:07