gpt4 book ai didi

.net - WPF 数据虚拟化问题

转载 作者:行者123 更新时间:2023-12-03 10:14:17 26 4
gpt4 key购买 nike

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

我知道我在 WPF 中“免费”获得 UI 虚拟化(我在 VirtualizedStackPanel 模式下使用 Recycle 和延迟滚动),但我必须虚拟化数据。我对 WPF 完全陌生,所以我尝试利用最好的 existing solution我发现。它可以工作,但每次刷新计数时都会闪烁,并且每次重新加载时都会丢失 SelectedItem(我认为这是因为它触发了“重置”类型的 CollectionChanged 重新加载整个集合)。我尝试使用“添加”事件而不是“重置”,但它需要实际添加到集合中的项目列表,并且每秒获取数千个对象只是为了将它们传递给事件并没有任何意义并扔掉它们,因为它们无论如何都是虚拟化的。我也试着开火PropertyChanged对于 Count属性,以便 ListBox 会更新它的索引范围/调整滚动条,奇怪的事情开始发生:滚动条会调整到新的计数,尽管列表项不会显示并且仍然有很多闪烁。

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

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

最佳答案

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

我是这样实现的...

  • 我有一个线程安全 ObservableCollection调用FastObservableCollection ... Updating an ObservableCollection in a separate thread
  • 我添加了对 AddRange() 的支持在上面FastObservaleCollection用于不带 CollectionChanged 的批量插入通知。 CollectionChanged对于从批量添加的最后一个项目,通知只会触发一次.... http://peteohanlon.wordpress.com/2008/10/22/bulk-loading-in-observablecollection/
  • 使用线程安全CollectionViews .您可以自定义 Collection View 并调度 SourceCollection.CollectionChanged 的事件通过引发自定义“刷新”事件在正确的线程上。

  • 此链接提供已发送集合更改通知的指南... Where do I get a thread-safe CollectionView?
  • 我将 ListBoxes 更改为使用 SelectedValue绑定(bind)而不是 SelectedItem绑定(bind)并确保 SelectedValue是原始类型(值类型)。这保持了按值选择。
  • 我会调用 ListBox.SelectedValue的绑定(bind)表达式的 UpdateSource()UpdateTarget()当 ListBox ItemsSource (即从 CollectionView 引发的自定义刷新事件)通过附加行为处理时。

  • 现在它像魅力一样工作,没有任何闪烁,并且也保持选择。

    关于.net - WPF 数据虚拟化问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6942603/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com