C# WPF:从数据库/预渲染挂钩控制可见性

C# WPF:从数据库/预渲染挂钩控制可见性,c#,.net,wpf,presentation-layer,C#,.net,Wpf,Presentation Layer,我们有一个相当奇怪的要求:WPF应用程序中任何控件的可见性都是由数据库表驱动的 这意味着我们有一个存储元素名称及其可见性的表 现在,我正在寻找一种在客户端实现此功能的优雅方法 我可以创建自己的UserControl,并在任何地方继承它,提供InitializeComponent模板方法。但是如果有人以编程方式添加更多的ChildControl怎么办 我根本不想让我的控件知道这个机制。我希望在某个点(预控制渲染)挂接/截取,并根据数据库调整控件的可见性 这有可能吗?如果没有,你会如何设计它呢?我做

我们有一个相当奇怪的要求:WPF应用程序中任何控件的可见性都是由数据库表驱动的

这意味着我们有一个存储元素名称及其可见性的表

现在,我正在寻找一种在客户端实现此功能的优雅方法

我可以创建自己的UserControl,并在任何地方继承它,提供InitializeComponent模板方法。但是如果有人以编程方式添加更多的ChildControl怎么办

我根本不想让我的控件知道这个机制。我希望在某个点(预控制渲染)挂接/截取,并根据数据库调整控件的可见性

这有可能吗?如果没有,你会如何设计它呢?

我做了如下工作:

我从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;
    }
public static T FindVisualChildByName(DependencyObject父对象,字符串名称),其中T:DependencyObject
{
for(int i=0;i
我不喜欢这个解决方案,但它是有效的