2010-12-23 11 views
4

LogicalTreeHelper.GetParent() 메서드를 재귀 적으로 사용하여 다양한 다른 WPF 요소의 루트 요소를 찾습니다. 이 거의 모든 일을 잘 작동하지만 DataGridTextColumn 같은 DataGridColumn 실패합니다. 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

안녕하세요 ... 내가 볼 수 찾을 수 원하는 열 각 데이터 그리드에 대한 열을 비교합니다. DataGrid.Columns 속성은 TextBlock.Text 또는 다른 속성과 마찬가지로 일반 속성입니다. DataGrid는 열 정의를 사용하여 열을 생성하지만 정의 자체는 시각적 트리에 추가되지 않습니다. DataGridColumn에서 부모로 탐색하려는 이유를 묻는 질문을 할 수 있습니까? – ColinE

+0

루트 요소의 유형을 찾는 데 필요한 MarkupExtension을 작성했습니다. – slurmomatic

+0

그럼 DataGridColumn에서 부모 DataGrid를 찾고 싶습니까? –

답변

5

은 DataGridColumn이 속성을 가지고 있지만 당신이 그것을 얻기 위해 반사를 사용해야합니다 그래서 민간의 :

내 코드는 논리적 루트를 찾을 수 있습니다. 어느 쪽이든 또는이 VisualTree에서 몇 가지 검색을하고의 DataGridColumn 시각적 또는 논리적 트리의 일부가 아닌 이유

public DataGrid GetDataGridParent(DataGridColumn column) 
{ 
    PropertyInfo propertyInfo = column.GetType().GetProperty("DataGridOwner", BindingFlags.Instance | BindingFlags.NonPublic); 
    return propertyInfo.GetValue(column, null) as DataGrid; 
} 
+0

DataGridOwner 속성이 설정되어 있지 않으면 가져올 수 없습니다. 그런 다음이 함수는 null을 반환합니다. 또한 명시 적 쿼리가 필요하지 않으므로 열이있는 경우에도 DataGridOwner의 차례가 필요합니다. column.DataGridOwner – peter70

0
var grid = ((Telerik.Windows.Controls.GridView.GridViewCellBase) 
      ((sender as FrameworkElement).Parent)).Column.DataControl;