WPF: управление видимостью из базы данных / перехватчика - PullRequest
1 голос
/ 05 августа 2010

у нас довольно странное требование: видимость любого элемента управления в нашем WPF-приложении определяется таблицей базы данных.

Это означает, что у нас есть таблица, в которой хранится название элемента и его видимость.

Теперь я ищу элегантный способ реализовать эту функцию на стороне клиента.

Я мог бы создать свой собственный UserControl и наследовать от него везде, предоставляя метод шаблона InitializeComponent. Но что, если кто-то программно добавит больше дочерних элементов управления?

Я не хочу, чтобы мои органы управления вообще знали об этом механизме. Я хочу подключить / перехватить в определенной точке (предварительный рендеринг элемента управления) и настроить видимость элемента управления в соответствии с базой данных.

Это как-то возможно? А если нет, то как бы ты это спроектировал?

1 Ответ

0 голосов
/ 05 августа 2010

Итак, вот что я сделал:

Я унаследовал от UserControl и поставил проверку в EventHandler для Loaded Event.

Затем я позволяю своим элементам управления наследоваться от моего 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;
    }

Мне не нравится это решение, но оно работает.

...