2011-01-31 18 views
1

私はデータバインドされているTreeViewを持っています。私はTreeViewItemsを拡張したいと思うが、3のような深さにしたい。WPFツリービュー特定の深さにのみ展開しますか?

通常は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イベントに登録して(そこから再帰呼び出しを行うことで)これを行うこともできますが、このアプローチは試していません。

関連する問題