2010-09-10 32 views
1

我有我綁定到的ItemsSource一個列表框,如下所示:何時爲ListBox創建ListBoxItems?

var foos = new ObservableCollection<Foo> { foo1, foo2, foo3 }; 
var listBox = new ListBox { ItemsSource = _foos }; 

現在我希望做一些操作馬上對持有項目ListBoxItems,但他們似乎並沒有被正確的創建遠。他們?是否有一些事件可以收聽,或者我只是試圖以無效的方式獲取ListBoxItem?我做這樣的(和已驗證它工作的地方,我知道列表框「準備好」):

var lbi = listBox.ItemContainerGenerator.ContainerFromItem(foo1) as ListBoxItem; 

注意,這是在單元測試正在做,所以我想ListBox中從未呈現。這就是爲什麼ListBoxItems沒有創建?我可以手動觸發創建ListBoxItems嗎?

回答

3

項目創建完成異步並取決於面板,它可能會發生它根本不創建(virtualization)。您正在尋找的活動是ItemContainerGenerator.StatusChanged。在SO上進行谷歌搜索,你會發現很多例子。但是,直接搜索和使用這些項目可能會變得複雜。

Here是一篇很好的文章,詳細討論了項目創建。另請參閱ancestor -article。

BTW: 我建議你看看MVVM模式。雖然有一點點時間你很少學習它(與WPF學習時間無法相比),但它會爲你節省很多時間。 Here你可以找到Jason Dolinger的視頻鏈接,它給你一個很好的起點。

更新:

如所承諾的評論,這裏的功能來搜索可視化樹(僅當虛擬化是關可用)。

void FindChildFrameworkElementsOfType<T>(DependencyObject parent,IList<T> list) where T: FrameworkElement{    
    DependencyObject child; 
    for(int i=0;i< VisualTreeHelper.GetChildrenCount(parent);i++){    
     child = VisualTreeHelper.GetChild(parent, i); 
     if (child is T) { 
      list.Add((T)child); 
     } 
     FindChildFrameworkElementsOfType<T>(child,list); 
    } 
} 
+0

Thx。將查看文章並嘗試使用StatusChanged事件。我已經在使用MVVM,視頻確實很棒。但是,在這種情況下,我需要回顧繼承我正在處理的ListBox的自定義控件的單元測試的詳細信息。 – stiank81 2010-09-10 09:08:37

+0

@ stiank81:如果列表中的項目很少,則可以使用ListBox上的VirtualizingStackPanel.IsVirtualizing =「False」禁用虛擬化。對於小數據集這不會是一個問題。根據您的單元測試,您也可以僅在單元測試時禁用虛擬化。 – HCL 2010-09-10 09:37:09

+0

是的,我只想爲單元測試做到這一點,但它似乎並沒有從代碼中得到它。它說這是一個私有財產,但爲什麼我可以從xaml到達?任何想法,如果我可以以某種方式觸發代碼? – stiank81 2010-09-10 10:10:40