我是Silverlight的新手......
我想要一个页面根据当前用户安全角色显示元素(按钮,网格,图像)。基本上,我想附加一个元素所需的安全角色,并调用我的代码来决定元素是否显示。
类似(添加属性 RequiredRole )
<Button RequiredRole="Administrator" x:Name="PushBtn" Content="PushMe"/>
在这种情况下,如果用户没有足够的安全权限,我的代码会将Button.visibility设置为隐藏。
我在文档中找不到任何可能帮助我实现此类内容的DependentProperties。
如何做到这一点? (如果这是考虑这个问题的正确方法......)
感谢。
答案 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;
}
}
}