在表单中,我为每个返回的字段设置了用户控件。该控件由堆栈面板内的标签和texblock组成。此控件是构成我的表单的datatemplate的一部分,该表单由包含用户控件的包装面板组成。我的意图是渲染表单以评估模型中返回的绑定属性,如果为null,则将控件的可见性设置为折叠。目的是仅在具有返回数据的表单内呈现字段。包裹面板允许控件保持内联与允许表单中的多余空格。
我最初的想法是迭代返回的List,如果模型中的属性为null,则设置通过依赖项属性折叠的控件的可见性。我在这里关注的是性能,因为有些表单有超过700个字段/属性。
我很想知道是否有人做过类似的方法或者他们用什么方法来控制UIElements的可见性
提前感谢任何建议
答案 0 :(得分:0)
我们使用依赖属性来确定控件的可见性。我们与授权库一起执行此操作。所以在我们的xaml中,代码看起来像这样:
<ListBoxItem x:Name="About"
Content="About Us"
AuthLib:Authorization.Visibility="WebUser"
Margin="10,5,10,5" />
<ListBoxItem x:Name="Accounting"
Content="Work Order Acct"
AuthLib:Authorization.Visibility="Admin, Accounting,Finance"
Margin="10,5,10,5" />
WebUser是任何经过身份验证的用户,显然会计/财务/管理员角色具有提升的权限。
我们已经在页面上进行了几十次调用而没有任何问题,但从来没有数百次。可能值得复制/粘贴,看看它是怎么回事。
如果它值得,这是我们的Auth库中的visibility属性:
#region Visibility
public static string GetVisibility(UIElement obj)
{
return (string)obj.GetValue(VisibilityProperty);
}
public static void SetVisibility(UIElement obj, string value)
{
obj.SetValue(VisibilityProperty, value);
}
/// Using a DependencyProperty as the backing store for requiresRole. This enables animation, styling, binding, etc...
public static readonly DependencyProperty VisibilityProperty = DependencyProperty.RegisterAttached(
"Visibility",
typeof(string),
typeof(Authorization),
new PropertyMetadata(Visibility_Callback));
// This callback will be invoked when some control will receive a value for your 'Visibility' property
private static void Visibility_Callback(DependencyObject source, DependencyPropertyChangedEventArgs e)
{
var uiElement = (UIElement)source;
if (App.IsAuthenticated)
{
RecalculateControlVisibility(uiElement);
}
else
{
EventHandler eh = null;
eh = delegate
{
RecalculateControlVisibility(uiElement);
};
App.Authenticated += eh;
RecalculateControlVisibility(uiElement);
}
}
private static void RecalculateControlVisibility(UIElement control)
{
//Authorization.UserHasRole() - is your code to check roles
if (Authorization.UserHasRole(GetVisibility(control)))
{
control.Visibility = Visibility.Visible;
}
else
{
control.Visibility = Visibility.Collapsed;
}
}
#endregion