свернуть UIElements в приложении Silverlight LOB на основе данных в модели - PullRequest
1 голос
/ 04 мая 2011

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

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

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

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

1 Ответ

0 голосов
/ 04 мая 2011

Мы используем Dependency Properties, чтобы определить видимость элементов управления.Мы делаем это совместно с нашей библиотекой авторизации.Таким образом, в нашем 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:

#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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...