2010-12-23 64 views
4

我使用LogicalTreeHelper.GetParent()方法遞歸地查找各種其他WPF元素的根元素。這幾乎適用於所有情況,但DataGridColumn失敗,如DataGridTextColumn。 我發現DataGridColumn不是邏輯樹和視覺樹的一部分。我能以某種方式找到它所屬的DataGrid(然後從網格中獲取根目錄)?查找DataGridColumn的根元素

閱讀MSDN文檔我找不到合適的解決方案。謝謝。

我的代碼,以查找邏輯根:

private DependencyObject FindLogicalRoot(DependencyObject obj) 
{ 
    if (obj == null) 
    return null; 
    else 
    { 
     var parent = LogicalTreeHelper.GetParent(obj); 
     return parent != null ? FindLogicalRoot(parent) : obj; 
    } 
} 
+0

嗨,你好,我能明白爲什麼的DataGridColumn不是視覺或邏輯樹的一部分。 DataGrid.Columns屬性是一個常規屬性,就像TextBlock.Text或任何其他屬性一樣。 DataGrid使用您的列定義也會生成列,但是定義本身不會添加到可視化樹中。我可以問你爲什麼想從DataGridColumn導航到其父項? – ColinE 2010-12-23 11:30:31

+0

我在寫一個MarkupExtension,我需要找到根元素的類型。 – slurmomatic 2010-12-23 12:30:44

回答

5

的DataGridColumn擁有此屬性,但它是私有的,所以你必須使用反射來得到它。如果不是這樣,做的一些的VisualTree搜索和比較列的每個數據網格到你想要的欄目找到

public DataGrid GetDataGridParent(DataGridColumn column) 
{ 
    PropertyInfo propertyInfo = column.GetType().GetProperty("DataGridOwner", BindingFlags.Instance | BindingFlags.NonPublic); 
    return propertyInfo.GetValue(column, null) as DataGrid; 
} 
0
var grid = ((Telerik.Windows.Controls.GridView.GridViewCellBase) 
      ((sender as FrameworkElement).Parent)).Column.DataControl;