2011-01-31 1 views
1

나는 데이터 바인딩 된 TreeView 있습니다. TreeViewItems를 확장하고 싶습니다. 그러나 말할 수는 있습니다.WPF Treeview 특정 깊이로만 확장 하시겠습니까?

일반적으로 TreeViewItem.ExpandSubtree()를 발행 할 것이지만 모든 것이 확장되어서 매우 간단합니다. ? 여기

는 처음이다 내가 뭘하려합니다, 나는 아래의 방법을 만든 후 3

private void ExpandTree(ItemContainerGenerator gen, ItemCollection items, int depth) 
{ 
    depth--; 
    foreach (var item in items) 
    { 
     TreeViewItem itm = (TreeViewItem)gen.ContainerFromItem(item); 
     if (itm == null) continue; 
     itm.IsExpanded = true; 


     if(depth!=0 && itm.Items.Count > 0) ExpandTree(itm.ItemContainerGenerator,itm.Items,depth); 
    } 
} 

문제의 깊이, 트 리뷰에서 항목을 수집 그것은 내 트 리뷰를 ItemContainerGenerator를 전달하고있다 재귀 적으로 모든 하위 항목에 대한 ItemContainerGenerator를 다시 호출하는 시점은 "NotStarted"상태이며 호출 될 때마다 null을 반환합니다. 내가 덫을 놓는 동안 그것은 나무가 단지 1의 깊이로만 열리고 내가 원하는 3이 아니라는 것을 의미합니다.

무엇이 여기에 있습니까?

답변

2

자식에게 ItemContainerGenerator 시간을 지정하여 손자를 만들 때 지연이 없습니다. 이 솔루션은 인프라를 결합 후 데이터를 실행할 수있는 충분한 시간이 있었다 재귀 호출을 예약 할 WPF 디스패처를 요청하는 것입니다 : 대리자가 호출되는 시간,

Action recurse =() => ExpandTree(itm.ItemContainerGenerator, itm.Items, depth); 
itm.Dispatcher.BeginInvoke(DispatcherPriority.ApplicationIdle, recurse); // note the priority 

자, ItemContainerGenerator는 시간을 준 것 실행하고 컨테이너를 사용할 수 있습니다.

자식 ItemContainerGenerator의 StatusChanged 이벤트에 가입 (및 거기에서 재귀 호출 만들기)하여이 작업을 수행 할 수도 있지만이 방법을 시도하지 않았습니다.