【发布时间】:2011-10-20 00:48:03
【问题描述】:
我需要在 WPF ListBox 中显示大约几百万个项目(我知道这是多么糟糕的主意,但我必须这样做)。新项目以非常快的速度到达,每秒数千个,但除此之外没有对列表进行任何更改:项目永远不会被删除或修改。 我需要每秒至少刷新一次 LisBox 控件。
我知道我在 WPF 中“免费”获得 UI 虚拟化(我在 Recycle 模式和延迟滚动中使用 VirtualizedStackPanel),但我必须虚拟化数据。我对 WPF 完全陌生,所以我尝试利用我发现的最好的 existing solution。它可以工作,但每次刷新计数时都会闪烁,并且每次重新加载时都会丢失 SelectedItem(我认为这是因为它触发了重新加载整个集合的“重置”类型的 CollectionChanged)。我尝试使用“添加”事件而不是“重置”,但它需要实际添加到集合中的项目列表,并且每秒获取数千个对象只是为了将它们传递给事件并没有任何意义并扔掉它们,因为它们无论如何都是虚拟化的。我还尝试为Count 属性触发PropertyChanged,以便ListBox 更新它的索引范围/调整滚动条,奇怪的事情开始发生:滚动条会调整到新的计数,尽管列表项不会显示并且仍然有很多闪烁。
换句话说:我如何通知 ListBox 控件 N 新项目已添加到绑定集合中,以便 ListBox 只会调整滚动条范围(并且不会问我对于添加的项目,直到它们实际显示)。
我在这个项目中使用 .NET 4.0 和 Caliburn.Micro,但我怀疑这会影响潜在的解决方案。
【问题讨论】: