懒惰加载wpf Combobox项目

时间:2010-05-25 01:03:42

标签: c# wpf data-binding

我有一个IEnumerable<>懒惰加载它的数据。我想将一个Combobox的ItemsSource设置为IEnumerable,但是当我这样做时,无论如何都会加载所有数据(这会删除延迟加载点)。

我也尝试过使用Linq-To-Sql,因为它似乎是一个类似的理论,它也会加载所有数据。

有一种简单的方法吗?

6 个答案:

答案 0 :(得分:3)

答案 1 :(得分:2)

不要直接将控件绑定到IEnumerable。相反,将它绑定到一个ObservableCollection(在开头是空的。)同时,仍然像往常一样在IEnumerable上进行延迟加载(由下拉组合框或其他东西触发。)当数据加载或你有足够的时候数据,将项添加到ObservableCollection以填充组合框。

答案 2 :(得分:1)

我认为WPF ComboBox不支持从ItemsSource延迟加载项目。为什么你还需要延迟加载,什么时候你会期望它会触发延迟加载?

答案 3 :(得分:1)

将ComboBox的ItemsSource绑定到ObservableCollection。

现在每当你的IEnumerable延迟加载数据时,立即将它添加到ObservableCollection

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

这将在添加每个项目后更新UI。

答案 4 :(得分:1)

我正在尝试做同样的事情。但是正如我调查的那样,如果你想在combobox上使用标准绑定(集合到ItemsSource和dataItem到SelectedValue / SelectedItem),就必须编写自己的控件。 Combobox继承自Selector,当你将集合绑定到ItemsSource属性并且你更改了属于SelectedValue / SelectedItem的属性值时,Selector会调用它自己的私有方法FindItemWithValue(对象值)。此方法首先遍历有界集合中的项目,直到找到相等的值。当然,这将使您收集所有项目之前加载所选项目。

答案 5 :(得分:1)

如果您愿意自己创建具有列表的自定义类,则可以使用INotifyPropertyChanged接口来告知您的集合已被修改。或者使用已经建议的ObservableCollection