我有一个IEnumerable<>,它会惰性加载数据。我希望将ComboBox的ItemsSource设置为IEnumerable,但是当我这样做时,它会加载所有的数据(这就失去了惰性加载的意义)。
我也尝试了使用Linq-To-Sql,因为它似乎是类似的理论,但它也会加载所有的数据。
有没有简单的方法可以解决这个问题?
我有一个IEnumerable<>,它会惰性加载数据。我希望将ComboBox的ItemsSource设置为IEnumerable,但是当我这样做时,它会加载所有的数据(这就失去了惰性加载的意义)。
我也尝试了使用Linq-To-Sql,因为它似乎是类似的理论,但它也会加载所有的数据。
有没有简单的方法可以解决这个问题?
尝试将ComboBox的ItemsSource-Binding中的IsAsync-属性设置为True:
<ComboBox ItemsSource={Binding YourItemsSourceProperty, IsAsync=True}
SelectedItem={Binding YourSelectionProperty} />
不要直接将控件绑定到IEnumerable。相反,将其绑定到一个ObservableCollection(一开始为空)。同时,像往常一样在IEnumerable上进行惰性加载(可以由下拉组合框或其他方式触发)。当数据加载完成或者已经有足够的数据时,将项目添加到ObservableCollection中以填充comboBox。
将你的 ComboBox 的 ItemsSource 绑定到一个 ObservableCollection。
现在,每当你的 IEnumerable 惰性加载数据时,立即将其添加到 ObservableCollection 中。
foreach(Item i in myIEnumerable)
{
myObsCol.Add(i);
}
每添加一个项目,这将更新用户界面。
我认为 WPF ComboBox 不支持从 ItemsSource 懒加载项。你为什么需要懒加载,以及什么情况下你希望它触发懒加载呢?
我正在尝试做同样的事情。但是在我的调查中,如果你想在组合框上使用标准绑定(将集合绑定到ItemsSource属性,将数据项绑定到SelectedValue/SelectedItem),那么必须编写自己的控件。 Combobox继承自Selector,当你将集合绑定到ItemsSource属性并且更改绑定到SelectedValue/SelectedItem的属性值时,Selector会调用它自己的私有方法FindItemWithValue(object value)。该方法遍历绑定的集合中的项,直到找到相等的值。这当然会导致你的集合在选定项之前加载所有项。
如果您想要创建自己的自定义类并拥有一个列表,您可以使用INotifyPropertyChanged接口来通知该集合已被修改。或者,如先前建议的那样,使用ObservableCollection。