나는 제어 할 수없는 컬렉션 클래스에 바인딩 된 TreeView 있습니다. 이 클래스 안에는 각각 고유 한 항목 모음이있는 객체의 모음이 있습니다. 이 계층 구조는 3 단계로 고정되어 있습니다. TreeView의 자식은 ObservableCollection에 포함되어 있으며 그에 따라 TreeView에서 업데이트됩니다. 이러한 개체 각각 내부의 컬렉션을 관찰 할 수 없습니다 및 그래서 수동으로 개체를 하나의 자식 개체를 추가 할 때마다 TreeView 데이터를 다시 바인딩해야합니다. 이렇게하면 확장 된 모든 하위 항목이 펼쳐지지 않은 상태로 재설정됩니다. 다시 바인딩 된 후에 다시 확장 될 수 있도록 확장 된 개체를 캐시하려고합니다. 아이들은 예상대로 작동하지만 TreeView의 손자를 확장하려고하면 null 객체가 생깁니다. 모든 부모 개체에 대한 참조가재 바인딩 한 후 다시 확장하기 위해 TreeViewItems를 캐시하는 방법은 무엇입니까?
TreeViewItem cfItem = treeView.ItemContainerGenerator
.ContainerFromItem(obj) as TreeViewItem;
cfItem.IsExpanded = true;
두 번째 수준의 컬렉션 :
는 TreeViewItem을 얻으려면 내가 ItemsControl에의 ItemContainerGenerator 속성을 사용합니다. 그래서 많은 객체를 가지고 있기 때문에 루프가 끝나고 부모 객체의 TreeViewItem을 찾기 위해 부모 객체를 사용합니다. 콜렉션에 추가되는 순서에 따라 (항상) 부모는 자식이 처리 될 것입니다. 따라서 나는이 코드 추한 라인을 얻을 :이 항목 OBJ에서 용기를 얻기 위해 시도 할 때
qualItem = (
(TreeViewItem)treeView.ItemContainerGenerator
.ContainerFromItem(
((Child)obj).ParentObject
)
)
.ItemContainerGenerator.ContainerFromItem(obj) as TreeViewItem;
이 줄은 항상 실패합니다. 그것은 성공적으로 부모 TreeViewItem을 가져 오지만, Child의 TreeViewItem 컨테이너를 가져 오려고 할 때, 나는 항상 null을 받는다. 문서는 ContainerFromItem은()
는 " 지정된 항목에 해당. System.Windows.UIElement가 널 항목이 에 속하지 않는 경우 항목의 컬렉션을 반환하거나 시스템 경우 반환 상태. Windows.UIElement가 이 생성되지 않았습니다. "
두 번째 수준 하위 항목이 상위 항목 컬렉션에 있음을 알고 있습니다. VS 2010에서 디버거를 체크하고 모든 항목이 있습니다. Google에서 답변을 검색하는 데 시간을 많이 들였고 컨테이너 항목이 백그라운드 작업자 스레드에서 만들어지고 자식 항목 컨테이너를 가져 오는 시도가있을 때 생성되지 않을 수도 있다고 말하는 사람이 나타났습니다. ItemContainerGenerator의 Status 속성이 GeneratorStatus.ContainersGenerated와 같을 때까지 기다렸다가 결과를 얻었습니다. 어떻게 든 두 번째 수준의 자식에 대한 TreeViewItem 컨테이너를 가져 와서 첫 번째 수준의 자식과 마찬가지로 다시 확장 할 수 있어야합니다. System.Windows.UIElement이 생성되지 않은 경우 항목이 항목 컬렉션에 속하는, 또는 하지 않는 경우, 지정된 항목에 해당
false로 VirtualizingStackPanel.IsVirtualizing 속성을 설정 아무것도하지 않았다 : 정보의
내 주요 소스는이 문서이었다. TreeView 요소에 다른 IsVirtualizing 속성이 있습니까? –