2010-06-17 29 views
3

我如何添加選項卡,在一個用戶控件存在從包含在標籤本身內的其他用戶控件一個TabControl TabControl的? 我可以做到這一點,而不需要在構造函數中傳遞tabcontrol作爲參數,也許通過一些靜態的全局方法?將標籤從內部用戶控件

我已經試過

public static ObservableTabCollection FindCollectionFromUC(this DependencyObject depObject) 
     { 
      bool loop = true; 
      var parent = (VisualTreeHelper.GetParent(depObject) as FrameworkElement); 
      while (loop) 
      { 
       if (parent.GetType() is typeof(TabControl)) 
       { 
        loop = false; 
        return ((ObservableTabCollection)((TabControl)parent).ItemsSource); 
       } 
       parent = parent.GetParent() as FrameworkElement; 
      } 
      return null; 
     } 

==== ====編輯的 解決方案是這樣的:

  bool loop = true; 
      var parent = depObject as FrameworkElement; 

      while (loop) 
      { 
       if (parent != null) 
       { 
        parent = VisualTreeHelper.GetParent(parent) as FrameworkElement; 
        var type = parent.GetType(); 
        if (parent.GetType() == typeof(TabControl)) 
         { 
          loop = false; 
          return ((ObservableTabCollection)((TabControl)parent).ItemsSource); 
         } 
       } 
       else { loop = false; } 
      } 
      return null; 

回答

1

的用戶控件需要尋找的TabControl的一些手段。你可以通過一個實例,作爲一個選項(可能是最強大的)。或者,您可以使用某種形式的依賴注入或服務來檢索正確的TabControl。

另一種選擇,雖然可能易碎,會直到你找到一個TabControl瀏覽了樹。 FrameworkElement(UserControl和其他面板派生的)定義了一個Parent屬性。這可能會讓你走上前去找到包含這個UserControl的TabControl實例。

+0

只有一個在整個應用程序的tabcontrol,所以它是唯一一個我需要找到。你能舉一個實現的例子嗎? – Jakob 2010-06-17 20:51:52

+0

只是遞歸地走「父」屬性,直到對象是一個TabControl。 – 2010-06-17 20:53:50

+0

我不完全知道我怎麼會做正確 – Jakob 2010-06-17 21:48:22