2012-02-17 5 views
1

WPF/Observable Collection을 처음 사용합니다. Observable Collection 인 목록으로 Populating TreeView를 사용하고 있습니다.ObservableCollection에 바인딩 된 TreeView 뷰

루트 노드/부모가 조건을 충족하지 못하고 자식 노드가 만족하더라도 루트 노드를 필터링 할 수없는 트리를 필터링하려고합니다.

자식 노드가 기준을 만족하므로 하위 노드의 전체 트리 경로와 함께 표시되어야합니다.

Root 
    Animal 
    Dog 
    Cat 
    Fish 
    Fresh Water 
    Salt Water 

"물"을 검색하면 뿌리 생선 - 신선한 물 - 소금물이 보일 것입니다.

답변

0

지금까지 내가봤을 때 가장 잘 나온 필터링 및 정렬은 CollectionView 및 CollectionViewSource 듀오입니다.

내가 여기를 사용하는 방법에 대한 내용이수록 게시물이 있습니다 WPF ListBoxItem Visibility and ScrollBar

을 본질적으로 무엇을 당신이 CollectionViewSource 내부 컬렉션을 호스팅하는 일을하고 알려줍니다 때 Viewobject에 정의 필터를 추가하고 정렬된다 ItemsControl (ListBox, ListView, TreeView) - 표시 할 항목 및 표시 할 순서. 이 방법으로 컬렉션을 변경하거나 여러 컬렉션에서 개별 항목을 조작하지 않습니다.

내 비즈니스 오브젝트 클래스의 모든 ViewModels에 호스팅됩니다. ViewModel에는 각각 ViewModel에 대한 클래스 유형의 MyRecord라는 속성이 있습니다 (나중에이 방법을 사용하면 어떤 ViewModelType에 관계없이 해당 메서드를 호출 할 수 있습니다. 나중에 Yay Late Binding!)

아무리해도 필터 방법은 다음과 같습니다.

private bool FilterByString(string filterString) 
    { 
     foreach (CustomerViewModel custVM in cvs.Source) 
     { 
      FilterChild(filterString, custVM); 
      if (custVM.MatchesFilter(filterString)) 
      { 
       return true; 
      } 
      else 
      { 
       return false; 
      } 

     } 
    } 

    private bool FilterChild(string filterString, Object parent) 
    { 
     bool match = false; 
     if (parent.MyChildren != null && parent.MyChildren.Count > 0) 
     { 
      foreach (Object Child in parent.MyChildren) 
      { 
       //If any of the children return true, then this method returns true. 
       //if all children return false, this method returns false. 
       bool innerMatch = Child.MatchesFilter(filterString); 
       match = (match == false ? innerMatch : match); 
       Child.MatchesFilter(filterString); 
       FilterChild(filterString, Child); 
      } 

     } 
     bool outerMatch = parent.MatchesFilter; 
     if (outerMatch || match) 
     { 
      return true; 
     } 
     else 
     { 
      return false; 
     } 
    } 

이제 기억합니다. 나는 실제로 아이들을 걸러 내고있는 중이 아니 었습니다. 나는 그들을 붕괴 시키려고했습니다. ViewModel의 속성으로 설정된 각 항목의 확장 된 속성을 가지며 MatchesFilter 메서드가 호출 될 때 해당 속성이 설정되었습니다. 최상위 항목 만 필터링되었습니다. (해당 항목 아래의 모든 항목이 필터와 일치하지 않는 경우에만)

이것은 예상 한 기능이 아닐지 모르지만 현재로서는 갖고있는 기능입니다.

+0

답변 해 주셔서 감사합니다. 그러나 이것은 나에게 효과가있는 것 같지 않습니다. (Hierarchical 데이터에서 작동하는지 여부는 루트 수준에서 필터를 적용하지만 하위 수준 노드에서는 필터를 적용하지 않습니다. 이상한 일을하고 있습니다.이 예제를 트리보기 - 계층 적 데이터로 테스트했는지 확인하고 싶습니다. 예제에서 보았습니다. – nmgans

+0

위의 예제에서 Search는 "Animal"과 "Fish"에서만 작동하며 그렇지 않습니다. 자식 요소에 적용합니다. "d"를 입력하면 "d"이후 아무 것도 반환하지 않고 "Animal"또는 "Fish"에 없습니다. 개가 "d"를 가졌기 때문에 동물 -> 개가 필요했습니다. 트리의 모든 레벨에서 필터를 적용하는 방법을 알려주십시오. – nmgans

+0

필터 논리 방법에서 하위 개체가 필터와 일치하는지 확인하기위한 몇 가지 방법이 필요합니다. 내가 당신을 위해 게시하고 싶은 예제를 찾을 수 없습니다. 이 클래스에는 계층 구조의 각 클래스에 대해 문자열을 사용하고 일치 필터에 대해 bool을 반환하는 인스턴스 메서드가 있습니다. 그런 다음 내 필터 논리에서 방금 트리를 이동하여 항목을 다시 가져 와서 최상위 수준으로 다시 버블 링하는 블록을 만들었습니다. (생각해 보니, 필자는 클래스 뷰 모델에 대한 속성을 가져야 만 했으므로 확장 필터는 필터와 일치하도록 설정했습니다 ...) – CodeWarrior

관련 문제