2010-08-05 54 views
1

我们有一个相当奇怪的要求:WPF应用程序中任何控件的可见性都由数据库表驱动。WPF:从数据库/预渲染钩子控制可见性

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

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

我可以创建我自己的UserControl并从它处继承,提供一个InitializeComponent模板方法。但是如果某人以编程方式添加更多的子控件呢?

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

这是否有可能?如果不是,你会如何设计它?

回答

0

因此,这里是我做过什么:

我从用户控件继承,并把检查的一个事件处理程序的Loaded事件。

然后我让我的控制从我的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; 
    } 

我不喜欢这个解决方案,但它的工作原理。