свернуть UIElements в бизнес-приложении Silverlight на основе данных в модели

В форме у меня есть пользовательский элемент управления для каждого возвращаемого поля. Элемент управления состоит из метки и текстового блока внутри панели стека. Этот элемент управления является частью шаблона данных, который составляет мою форму, состоящую из панели переноса, содержащей пользовательские элементы управления. Мое намерение состоит в том, чтобы при отображении формы оценить связанное свойство, возвращаемое в моей модели, и если оно равно нулю, установить видимость элемента управления в свернутом виде. Цель состоит в том, чтобы поля отображались только в форме, для которой возвращаются данные. Панель обтекания позволяет элементам управления оставаться встроенными, а не оставлять лишнее пустое пространство в форме.

Моя первоначальная мысль заключалась в том, чтобы выполнить итерацию по возвращаемому списку, и если свойство в модели имеет значение null, установить видимость элемента управления на свернутое через свойство зависимости. Меня беспокоит производительность, поскольку некоторые формы имеют более 700 полей/свойств.

Мне было любопытно узнать, использовал ли кто-нибудь подобный подход или какой подход они использовали для управления видимостью UIElements.

Спасибо заранее за любые предложения


person rlcrews    schedule 03.05.2011    source источник


Ответы (1)


Мы используем свойства зависимостей для определения видимости элементов управления. Мы делаем это совместно с нашей библиотекой авторизации. Итак, в нашем 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 — это любой аутентифицированный пользователь, и, очевидно, роли Accounting/Finance/Admin имеют повышенные привилегии.

Мы сделали это с десятками вызовов на странице без каких-либо проблем, но не с сотнями. Возможно, стоит скопировать / вставить, чтобы посмотреть, как это происходит.

Если это имеет смысл, вот свойство видимости в нашей библиотеке аутентификации:

#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
person Scott Silvi    schedule 03.05.2011
comment
Спасибо, Скотт, это похоже на то, о чем я думал. Спасибо за подтверждение моего подхода. - person rlcrews; 04.05.2011