WPF: Управление видимостью из базы данных / Prerender Hook
У нас есть довольно странное требование: видимость любого элемента управления в нашем WPF-приложении определяется таблицей базы данных.
Это означает, что у нас есть таблица, в которой хранится название элемента и его видимость.
Сейчас я ищу элегантный способ реализовать эту функцию на стороне клиента.
Я мог бы создать свой собственный UserControl и наследовать от него везде, предоставляя метод шаблона InitializeComponent. Но что если кто-то программно добавит больше дочерних элементов управления?
Я не хочу, чтобы мои органы управления вообще знали об этом механизме. Я хочу подключить / перехватить в определенный момент (предварительный рендеринг элемента управления) и настроить видимость элемента управления в соответствии с базой данных.
Это как-то возможно? А если нет, то как бы вы это спроектировали?
1 ответ
Итак, вот что я сделал:
Я унаследовал от UserControl и поставил проверку в EventHandler для загруженного события.
Затем я позволяю своим элементам управления наследоваться от моего CustomControl, это работает довольно хорошо.
Реализация FindName() не найдет FrameworkElements по какой-то причине, которую я не знаю, хотя их имена определены в xaml. Итак, вот процедура, которую я использую, чтобы найти детей по их именам:
public static T FindVisualChildByName<T>(DependencyObject parent, string name) where T : DependencyObject
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++)
{
var child = VisualTreeHelper.GetChild(parent, i);
string controlName = child.GetValue(Control.NameProperty) as string;
if (controlName == name)
{
return child as T;
}
else
{
T result = FindVisualChildByName<T>(child, name);
if (result != null)
{
return result;
}
}
}
return null;
}
Мне не нравится это решение, но оно работает.