2011-01-31 107 views
1

我有一個數據綁定的TreeView。我想展開TreeViewItems,但只能深入一下讓我說3。WPF Treeview只展開到一定深度?

通常我會發出一個TreeViewItem.ExpandSubtree(),但它擴展了一切,所以我採取了刺我自己的,因爲它應該是相當簡單的權利?

這裏是我試過了,我做了下面的方法,然後ItemContainerGenerator通過我的樹視圖它和收集物品從樹視圖,用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的所有子項都具有「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事件(並從那裏進行遞歸調用)來完成此操作,但我沒有嘗試過這種方法。