首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WPF数据虚拟化问题

WPF数据虚拟化问题
EN

Stack Overflow用户
提问于 2011-08-04 13:49:56
回答 2查看 2.2K关注 0票数 2

我需要在WPF ListBox中显示大约几百万个项目(我知道这是多么糟糕的想法,但我必须这样做)。新项目的到达速度非常快,每秒数千次,但除此之外,不会对列表进行任何更改:项目从未被移除或修改。我需要LisBox控件至少每秒刷新一次。

我知道我在WPF中“免费”地获得了UI虚拟化(我在使用VirtualizedStackPanel模式下的Recycle模式和延迟滚动),但是我必须虚拟化数据。我对WPF完全陌生,所以我尝试利用我找到的最好的现有解决方案。它可以工作,但是每次刷新计数时都会闪烁,每次重新加载时都会丢失SelectedItem (我认为这是因为它触发了重新加载整个集合的“重置”类型的CollectionChanged )。我尝试使用"Add“事件,而不是"Reset”,但它需要列出实际添加到集合中的项,而且每秒获取数千个对象,仅仅是将它们传递给事件并丢弃它们是没有任何意义的,因为它们无论如何都是虚拟化的。我还试图只为PropertyChanged属性触发Count,这样ListBox就可以更新它的索引范围/调整滚动条,双滚动条就开始发生了:滚动条将根据新的计数进行调整,尽管列表项不会显示,而且仍然会有大量闪烁。

,换句话说:如何通知ListBox控件,N新项已添加到绑定集合中,以便ListBox只调整滚动条范围(在实际显示项目之前不会向我询问添加的项)。

我在这个项目中使用了.NET 4.0和Caliburn.Micro,但我怀疑这会影响到潜在的解决方案。

EN

回答 2

Stack Overflow用户

发布于 2011-08-04 15:25:19

我有类似的情况,我缓存的对象列表(以百万计)跨应用程序绑定到多个ListBoxes (加载在各个页面上),当缓存的项被添加、删除或编辑时,我必须维护选择并更新整个应用程序的更改,而无需滚动或闪烁。

我是这样实现的..。

  1. 我有一个线程安全的ObservableCollection叫做FastObservableCollection . 在单独的线程中更新ObservableCollection
  2. 我在上面的AddRange()中添加了对没有CollectionChanged通知的批量插入的支持。对于从大容量添加的最后一个项目,CollectionChanged通知只会触发一次.http://peteohanlon.wordpress.com/2008/10/22/bulk-loading-in-observablecollection/
  3. 使用线程安全CollectionViews。您可以通过引发自定义“刷新”事件来自定义集合视图,并在正确的线程上分派SourceCollection.CollectionChanged事件。

此链接提供了发送集合更改通知的指南.在哪里可以得到线程安全的CollectionView?

  1. 我将ListBoxes更改为使用SelectedValue绑定而不是SelectedItem绑定,并确保SelectedValue是原始类型(值类型)。这将按值维护所选内容。
  2. 当从ListBox.SelectedValue引发的自定义刷新事件(即从CollectionView引发的自定义刷新事件)通过附加行为处理时,我会调用ListBox的绑定表达式的UpdateSource()UpdateTarget()

现在,它就像魅力一样,没有任何装饰,也能保持选择。

票数 4
EN

Stack Overflow用户

发布于 2011-08-04 14:17:50

您需要创建一个实现非泛型IList接口以及泛型IList的自定义集合。如果这样做,列表框控件将不会枚举集合,而是使用this[]接口,这使您有机会在用户滚动时自动加载分页样式中的行。

下面是我在博客上发布的一个类似的解决方案:http://www.deanchalk.me.uk/post/WPF-e28093-DataContext-Virtualization-With-Paged-Services.aspx

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6942603

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档