#silverlight #c#-4.0 #uielement
#silverlight #c #-4.0 #пользовательский элемент
Вопрос:
Внутри формы у меня есть пользовательский элемент управления для каждого возвращаемого поля. Элемент управления состоит из метки и текстового блока на панели стека. Этот элемент управления является частью datatemplate, который составляет мою форму, которая состоит из панели переноса, содержащей пользовательские элементы управления. Мое намерение состоит в том, чтобы при визуализации формы оценить свойство bound, возвращаемое в моей модели, и, если оно равно null, установить видимость элемента управления в свернутое. Цель состоит в том, чтобы в форме отображались только поля, в которые возвращаются данные. Панель переноса позволяет элементам управления оставаться встроенными, не допуская избыточного пробела в форме.
Моей первоначальной мыслью было выполнить итерацию по возвращаемому списку и, если свойство в модели равно null, установить видимость элемента управления в свернутом виде с помощью свойства зависимости. Меня беспокоит производительность, поскольку некоторые формы содержат более 700 полей / свойств.
Мне было любопытно узнать, применял ли кто-нибудь аналогичный подход или какой подход они использовали для управления видимостью UIElements
Заранее спасибо за любые предложения
Ответ №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 — это любой аутентифицированный пользователь, и, очевидно, роли бухгалтерского учета / финансов / администратора имеют повышенные привилегии.
Мы делали это с десятками вызовов на странице без каких-либо проблем, но никогда с сотнями. Возможно, стоит скопировать / вставить, чтобы посмотреть, как это происходит.
На случай, если это того стоит, вот свойство 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
Комментарии:
1. Спасибо, Скотт, это соответствует тому, о чем я думал. Спасибо за проверку моего подхода.