2011-11-29 41 views
0

我得到了一個ItemsControl(一個TreeviewTreevieItem),其中Item充滿了我自己的模型。我不想以編程方式展開TreeView。所以我試試這個:無法從Treeview中的物品找到容器

var model = itemsControl_.Items.Select(i => i as MyModel).Where(ftn => ftn != null && ftn.key = searchedKey)); 

現在我已經建立了一個想要展開的模型。我搜索容器展開它:

var tvi = itemsControl_.ItemContainerGenerator.ContainerFromItem(model) as TreeViewItem; 
if(tvi!=null) 
{ 
    if (!tvi.IsExpanded) 
    { 
    tvi.IsExpanded = true; 
    }  
} 

有時tvi是空的!?!

有人可以解釋我怎麼可能?

回答

0

根據您的描述,似乎您想要展開TreeViewItem。 我認爲這很可能是由Virtualizating造成的。虛擬化附加屬性默認爲TreeView,這意味着如果一個項目不在視口中,它可能沒有獲得一個容器。 如果您在TreeView上調用GetContainerFromItem,則ItemContainerGenerator只搜索TreeView的直接子對象。所以你需要遞歸遍歷TreeView和子TreeViewItem對象。更復雜的是,如果TreeView虛擬化其項目(通過將VirtualizingStackPanel.IsVirtualizing屬性設置爲true來啓用虛擬化),則需要先創建子項目,然後才能檢查其數據對象。

希望這會有所幫助。

請參閱http://blogs.msdn.com/b/wpfsdk/archive/2010/02/23/finding-an-object-treeviewitem.aspx

問候 迪帕克

+0

THX回答。我沒有啓用虛擬化,也不知道如何刪除它。但即使我的treeview包含一個項目,我也會得到這個bug。並且我正在直接子節點中搜索一個項目,所以它不是遞歸性的問題。 –

相關問題