2011-08-03 5 views
0

뭔가 안에있는 요소를 찾으려면 다음과 같은 코드가 있습니다. 문제는 DataGrid의 첫 번째 열에 머리글에 CheckBox가있는 DataGrid가 있다는 것입니다. 확인란 자체는 부모 자식 창의 <controls:ChildWindow.Resources> 사전에있는 스타일에 정의되어 있습니다.Silverlight 4 - 시각적 트리 도우미가 자식 요소 0 개를 반환합니까?

런타임시 그리드 바인딩 제본의 모든 요소가 "선택됨"인 경우 지긋 지긋한 확인란을 선택해야합니다. 그러나 체크 박스가 스타일에 존재하기 때문에 쉽게 접근 할 수 없으므로 특정 체크 박스를 찾기 위해 전체 DOM을 따라 가야합니다.

이것은 DOM 탐색을 만드는 코드입니다. 그것은 내가 FrameworkElement에서 상속 모든 컨트롤에서 FindElement 또는 GetChildren 메서드를 호출 할 수 있도록를 FrameworkElement의 확장 방법으로 구현됩니다

public static class FrameworkElementExtensions 
{ 
    public static FrameworkElement FindElement(this FrameworkElement parentFrameworkElement, string childFrameworkElementNameToSearch) 
    { 
     FrameworkElement childFrameworkElementFound = null; 
     parentFrameworkElement.SearchElements(ref childFrameworkElementFound, childFrameworkElementNameToSearch); 
     return childFrameworkElementFound; 
    } 

    public static List<FrameworkElement> GetChildren(this FrameworkElement parentElement) 
    { 
     List<FrameworkElement> childFrameworkElementsFound = new List<FrameworkElement>(); 
     parentElement.GetChildren(childFrameworkElementsFound); 
     return childFrameworkElementsFound; 
    } 

    public static void SearchElements(this FrameworkElement parentFrameworkElement, ref FrameworkElement childFrameworkElementToFind, string childFrameworkElementName) 
    { 
     int childrenCount = VisualTreeHelper.GetChildrenCount(parentFrameworkElement); 
     if (childrenCount > 0) 
     { 
      FrameworkElement childFrameworkElement = null; 
      for (int i = 0; i < childrenCount; i++) 
      { 
       childFrameworkElement = (FrameworkElement)VisualTreeHelper.GetChild(parentFrameworkElement, i); 
       if (childFrameworkElement != null && childFrameworkElement.Name.Equals(childFrameworkElementName)) 
       { 
        childFrameworkElementToFind = childFrameworkElement; 
        return; 
       } 
       childFrameworkElement.SearchElements(ref childFrameworkElementToFind, childFrameworkElementName); 
      } 
     } 
    } 

    public static void GetChildren(this FrameworkElement parentFrameworkElement, List<FrameworkElement> allChildFrameworkElement) 
    { 
     int childrenCount = VisualTreeHelper.GetChildrenCount(parentFrameworkElement); 
     if (childrenCount > 0) 
     { 
      for (int i = 0; i < childrenCount; i++) 
      { 
       FrameworkElement childFrameworkElement = (FrameworkElement)VisualTreeHelper.GetChild(parentFrameworkElement, i); 
        allChildFrameworkElement.Add(childFrameworkElement); 
        childFrameworkElement.GetChildren(allChildFrameworkElement); 
      } 
     } 
    } 
} 

그래서 손의 문제는 그 난 SomeDataGrid.FindElement("HeaderCheckBox");의 라인을 따라 뭔가를 호출 할 때 항상 null을 반환합니다. 여기에서는 HeaderCheckBox라는 스타일 내에서 정의 된 SomeDataGrid 및 CheckBox라는 DataGrid가 있다고 가정합니다.

디버깅을 할 때 어떤 컨트롤을 호출했는지에 관계없이 코드에서 마지막 두 메서드에 사용 된 VisualTreeHelper.GetChildrenCount 메서드 호출이 항상 0을 반환한다는 것을 알았습니까? WTF?

누구든지이 문제를 해결하는 방법에 대해 알고 계십니까? 감사합니다. 마틴

+0

안녕하세요 ... 새로운 프로젝트에서 코드를 테스트하고 요청한 모든 것을 찾았습니다. 작풍에있는 CheckBox조차, 나는 그것이 의지 할 수있을 약간 의심이 있었다. 그건 그렇고, 내 GetChildrenCount (너 ... 너의 것)는 항상 아이들의 진짜 카운트를 반환했습니다. – NestorArturo

+0

참조 : http://geekswithblogs.net/codingbloke/archive/2010/12/19/visual-tree-enumeration.aspx – AnthonyWJones

+0

@NestorArturo 코드를 추가 하시겠습니까? 나는 다른 사람의 구현을 테스트하여 미쳐서는 안된다는 것을 증명하기를 원합니다 ... 플러스로 답을 쓰면 답을 줄 수도 있습니다. – bleepzter

답변

관련 문제