懒加载 WPF Combobox 项

4

我有一个IEnumerable<>,它会惰性加载数据。我希望将ComboBox的ItemsSource设置为IEnumerable,但是当我这样做时,它会加载所有的数据(这就失去了惰性加载的意义)。

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

有没有简单的方法可以解决这个问题?


在您的IEnumerable类上创建一个事件,例如OnDataChange,它将重置数据源。 如果符合您的要求,那就可以了。 - PostMan
6个回答

3

尝试将ComboBox的ItemsSource-Binding中的IsAsync-属性设置为True:

<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,在最终列表完全加载之前,用一些临时数据填充列表。

2

不要直接将控件绑定到IEnumerable。相反,将其绑定到一个ObservableCollection(一开始为空)。同时,像往常一样在IEnumerable上进行惰性加载(可以由下拉组合框或其他方式触发)。当数据加载完成或者已经有足够的数据时,将项目添加到ObservableCollection中以填充comboBox。


1

将你的 ComboBox 的 ItemsSource 绑定到一个 ObservableCollection。

现在,每当你的 IEnumerable 惰性加载数据时,立即将其添加到 ObservableCollection 中。

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

每添加一个项目,这将更新用户界面。


1

我认为 WPF ComboBox 不支持从 ItemsSource 懒加载项。你为什么需要懒加载,以及什么情况下你希望它触发懒加载呢?


这是用于从大型列表中选择的。我想这更像是自动完成而不是组合框。我知道我可以绑定到文本,过滤并在绑定到ItemsSource的属性中返回前x个结果,但我希望有一个更通用的东西。我认为类似的东西也可以用于ListBox,以提供类似于Bing图像搜索的功能。 - Chris McGrath

1

我正在尝试做同样的事情。但是在我的调查中,如果你想在组合框上使用标准绑定(将集合绑定到ItemsSource属性,将数据项绑定到SelectedValue/SelectedItem),那么必须编写自己的控件。 Combobox继承自Selector,当你将集合绑定到ItemsSource属性并且更改绑定到SelectedValue/SelectedItem的属性值时,Selector会调用它自己的私有方法FindItemWithValue(object value)。该方法遍历绑定的集合中的项,直到找到相等的值。这当然会导致你的集合在选定项之前加载所有项。


1

如果您想要创建自己的自定义类并拥有一个列表,您可以使用INotifyPropertyChanged接口来通知该集合已被修改。或者,如先前建议的那样,使用ObservableCollection。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接