Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于模型中的数据折叠Silverlight LOB应用程序中的UIElements_Silverlight_C# 4.0_Uielement - Fatal编程技术网

基于模型中的数据折叠Silverlight LOB应用程序中的UIElements

基于模型中的数据折叠Silverlight LOB应用程序中的UIElements,silverlight,c#-4.0,uielement,Silverlight,C# 4.0,Uielement,在一个表单中,我有一个用于返回每个字段的用户控件。控件由堆栈面板中的标签和texblock组成。此控件是组成我的表单的datatemplate的一部分,该表单由包含用户控件的包装面板组成。我的目的是在呈现表单时计算模型中返回的绑定属性,如果为null,则将控件的可见性设置为折叠。这样做的目的是只在具有返回数据的表单中呈现字段。“包裹”面板允许控件保持内联状态,而不是允许窗体中出现多余的空白 我最初的想法是遍历返回的列表,如果模型中的属性为null,则通过依赖属性将控件的可见性设置为折叠。我在这里

在一个表单中,我有一个用于返回每个字段的用户控件。控件由堆栈面板中的标签和texblock组成。此控件是组成我的表单的datatemplate的一部分,该表单由包含用户控件的包装面板组成。我的目的是在呈现表单时计算模型中返回的绑定属性,如果为null,则将控件的可见性设置为折叠。这样做的目的是只在具有返回数据的表单中呈现字段。“包裹”面板允许控件保持内联状态,而不是允许窗体中出现多余的空白

我最初的想法是遍历返回的列表,如果模型中的属性为null,则通过依赖属性将控件的可见性设置为折叠。我在这里关注的是性能,因为有些表单有700多个字段/属性

我很想知道是否有人做过类似的方法,或者他们使用了什么方法来控制UIElements的可见性


提前感谢您的建议

我们使用依赖属性来确定控件的可见性。我们与我们的授权库一起执行此操作。因此,在我们的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" />

谢谢斯科特,这与我的想法是一致的。谢谢你验证我的方法。
#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