2010-12-23 56 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;