我有一个IEnumerable<>懒惰加载它的数据。我想将一个Combobox的ItemsSource设置为IEnumerable,但是当我这样做时,无论如何都会加载所有数据(这会删除延迟加载点)。
我也尝试过使用Linq-To-Sql,因为它似乎是一个类似的理论,它也会加载所有数据。
有一种简单的方法吗?
答案 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