2010-05-25 168 views
3

我有一個IEnumerable <>它懶加載它的數據。我只想將一個Combobox的ItemsSource設置爲IEnumerable,但是當我這樣做時,無論如何都會加載所有數據(這會消除延遲加載的重點)。懶惰加載wpf組合框項目

我試過Linq-To-Sql,因爲它似乎是一個類似的理論,它也加載所有的數據。

有沒有簡單的方法來做到這一點?

+0

在您的IEnumerable類上創建一個事件,比如OnDataChange,它將重置DataSource。如果這符合您的要求 – PostMan 2010-05-25 01:06:32

回答

1

我不認爲WPF組合框支持從ItemsSource延遲加載項目。爲什麼你需要延遲加載,以及你希望什麼時候觸發延遲加載?

+0

這是從大型列表中選擇。我想這比自動完成更像是一個組合框。 我知道我可以綁定到文本,篩選並返回綁定到ItemsSource的屬性中的第一個x結果,我希望有一些更通用的東西。 我認爲類似的東西可以用於列表框給像Bing圖像搜索的東西。 – 2010-05-25 01:38:19

2

不要直接將控件綁定到IEnumerable。相反,將它綁定到一個ObservableCollection(在開始處是空的)。同時,仍然像往常一樣在IEnumerable上進行延遲加載(或者通過下拉組合框或其他方法觸發)。當數據加載或者當您擁有足夠的空間時數據,將項目添加到該ObservableCollection以填充組合框。

1

將ComboBox的ItemsSource綁定到ObservableCollection。

現在,只要您的IEnumerable延遲加載的數據,將其添加到的ObservableCollection立即

foreach(Item i in myIEnumerable) 
{ 
    myObsCol.Add(i); 
} 

這將更新UI各一次項目將被添加。

1

我正在嘗試做同樣的事情。但正如我調查,如果你想要在組合框上使用標準綁定(集合到ItemsSource和dataItem到SelectedValue/SelectedItem),有必要編寫自己的控件。 Combobox繼承自Selector,並且當您有限集合到ItemsSource屬性並且您將綁定到SelectedValue/SelectedItem的屬性值更改時,Selector將其調用它自己的私有方法FindItemWithValue(對象值)。此方法從首先遍歷有界集合中的項目,直至找到相同的值。這當然會讓你收集所有項目之前加載所選項目。

1

如果你願意做你自己的定製類,它將有一個列表,你可以使用INotifyPropertyChanged接口告訴你的集合已被修改。或用途的ObservableCollection,因爲它已經被建議

3

嘗試將IsAsync-屬性在ComboBox的的ItemsSource-綁定到真:

<ComboBox ItemsSource={Binding YourItemsSourceProperty, IsAsync=True} 
      SelectedItem={Binding YourSelectionProperty} /> 

如果不能改變什麼,看看這個一個: http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/3d343489-90c4-4bdc-8bd9-1046ec9daf76 也許你將需要使用IList來代替。

或者,您可以使用PriorityBinding來填充列表中的一些臨時數據,直到最終列表完全加載。