2010-08-05 70 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; 
    } 

我不喜歡這個解決方案,但它的工作原理。