基于模型中的数据在Silverlight LOB应用程序中折叠ui元素



在一个表单中,我有一个用户控件用于返回的每个字段。该控件由堆栈面板中的标签和文本块组成。这个控件是组成我的表单的数据模板的一部分,这个表单由一个包含用户控件的换行面板组成。我的意图是,当呈现表单以评估模型中返回的绑定属性时,如果它为空,则将控件的可见性设置为崩溃。这样做的目的是只在返回数据的表单中呈现字段。换行面板允许控件保持行内,而不允许表单中有多余的空白。

我最初的想法是遍历返回的列表,如果模型中的属性为空,则通过依赖项属性设置控件的可见性。我在这里的一个问题是性能,因为有些表单有超过700个字段/属性。

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

提前感谢您的建议

我们使用依赖属性来确定控件的可见性。我们使用授权库来执行此操作。在我们的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是任何经过认证的用户,显然会计/财务/Admin角色具有更高的权限。

我们在一个页面上做了几十次调用没有任何问题,但从来没有几百次。也许值得复制/粘贴一下看看效果如何。

下面是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

相关内容

  • 没有找到相关文章

最新更新