问题标签 [data-virtualization]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
350 浏览

c# - 数据虚拟化和 SelectionMode 扩展

我有一个 ListBox 绑定到实现 IList 和 IList 的 ItemsSource,但与绑定到非虚拟化 IList 相比,SelectionMode=Extended 行为似乎不是我所期望的

IList 行为:

VirtualizedCollection:IList,IList 行为:

它几乎像黑匣子?方法正在调用某种“获取当前选定的行”,在第二种情况下返回 1,但在第一种情况下获取真正的第 10 行。

如果特异性会有所帮助,Paul McClean 的 WPF 数据虚拟化是我正在使用的 virtualizedcollection 实现。当绑定时使用可视化集合时,他的源代码也有相同的错误。

0 投票
1 回答
1017 浏览

c# - 在 C# WPF 中渲染大格式表

我目前正在做一个 C# WPF 应用程序,它会生成一个比较报告的表。表格很大,有格式化的背景、前景等。

我尝试在 FlowDocument 中使用 Table,但处理速度很慢,几乎无法滚动。有什么办法可以解决这个问题吗?

我查看了数据虚拟化,但在 FlowDocument 中找不到与表相关的任何内容。仅供参考,FlowDocument 只是由一个带有许多格式化行的大表组成,它是使用XamlReader.Load().

任何优化性能的建议都将受到欢迎。

0 投票
1 回答
1368 浏览

wpf - WPF 列表框中的数据虚拟化

我有一个场景,其中我填充了一个包含 1000 个项目的列表框。我ItemsSource使用数据源设置属性。

我有一个要求,当 UI 加载时,我需要根据某些条件删除列表框的一个项目。我正在使用样式+附加属性通过在附加属性的回调方法中设置ContentTemplate来实现相同的目的。ListBoxItem

我的问题是,当我尝试为列表末尾的项目生成ListBoxItemusing时,我得到空值。ItemContainerGenerator.ContainerFromItem结果,我无法删除列表底部的列表框项目。

它是否与虚拟化有关。我想获得所有ListBoxItems负载。

有什么解决方法吗?

谢谢

0 投票
1 回答
1660 浏览

wpf - 具有数据虚拟化的 DataGrid 行请求模式

我使用来自CodePlex的一些想法以及Bea Stollnitz和 Vincent Da Ven Berhge 的论文(相同链接)的博客实现了一个数据虚拟化解决方案。但是我需要一种不同的方法,所以我决定编写自己的解决方案。

我正在使用DataGrid这个解决方案来显示大约一百万行。我也在使用 UI 虚拟化。我的解决方案是可行的,但是在某些情况下我遇到了一些奇怪的行为,即如何DataGrid从源请求数据。

关于解决方案

我最终写了一个清单来完成所有繁重的工作。它是一个名为VirtualList<T>.It实现ICollectionViewFactory接口的泛型类,因此集合视图创建机制可以创建一个VirtualListCollectionView<T>实例来包装它。这个类继承自ListCollectionView. 我没有按照建议编写自己的ICollectionView实现。继承似乎也可以正常工作。

VirtualList<T>整个数据拆分为页面。它获取总项目数,并且每次DataGrid通过列表索引器请求行时,它都会加载适当的页面或从缓存中返回它。这些页面在内部回收,并DispatcherTimer在空闲时间处理未使用的页面。

数据请求模式

  • 我学到的第一件事,VirtualList<T>应该实现IList(非通用)。否则,ItemsControl会将其视为一个IEnumerable并查询/枚举所有行。这是合乎逻辑的,因为DataGrid它不是类型安全的,所以它不能使用IList<T>接口。

  • 索引为 0 的行经常被DataGrid. 它似乎用于视觉项目测量(根据调用堆栈)。所以,我只是缓存这个。

  • 内部的缓存机制DataGrid使用可预测的模式来查询它显示的行。首先它从上到下询问可见行(每行两次),然后在可见区域(包括第一个可见行)之前以降序查询几行(取决于可见区域的大小)顺序如此,从下到上。之后,它从上到下在可见行(包括最后一个可见行)之后请求相同数量的行。

    如果可见行索引是 4,5,6。数据请求将是:4,4,5,5,6,6,4,3,2,1,6,7,8,9。

    如果我的页面大小设置正确,我可以从当前和以前加载的页面中处理所有这些请求。

  • 如果CanSelectMultipleItemsTrue并且用户使用 SHIFT 按钮或鼠标拖动选择了多个项目,则DataGrid枚举从列表开头到选择结尾的所有行。IEnumerable无论是否实现,此枚举都通过接口发生IList

  • 如果所选行不可见并且当前可见区域与所选行“远”,则有时 DataGrid 会开始请求从所选行到可见区域末尾的所有项目。包括其间的所有行,甚至不可见。我无法弄清楚这种行为的确切模式。也许我的实现是原因。

我的问题

  • 我想知道,为什么DataGrid对不可见行的请求,因为这些行在变得可见时会再次被请求?

  • 为什么需要每行请求两三次?

  • 谁能告诉我如何使 DataGrid 不使用IEnumerable,除了关闭多项选择?

0 投票
1 回答
2168 浏览

javascript - d3.js json结构添加数据

我正在绘制一个带有两个简单值的饼图:标签和值。这是我的json:

}

我不确定它是不是最好的结构,实际上 d3.js 我不能调用数据值。这是我的代码:

有什么建议么?

0 投票
1 回答
1327 浏览

wpf - 使用数据虚拟化切换多选时的 DataGrid 请求

加起来 4 个月前的一个帖子,不幸的是没有收到任何答案。

在带移位的数据网格中使用多选时,我基本上遇到了同样的问题。

当在一个巨大列表中间的某个地方(比如网格中有 1,000,000 个项目,所有数据都虚拟化)并且我要使用 shift + 鼠标单击从 500,000 到 500,050 中进行选择时,网格调用我的“GetEnumerator()”方法虚拟列表(类似于文森特和保罗的实现)。到目前为止,我所做的只是缓存页面上的 SelectMany。但不幸的是,导致没有正确选择行(而 ctrl + 鼠标单击完成了这项工作!)。

所以我发现,DataGrid 实际上需要从索引 0 到最后一个选择的所有项目。显然,这对于 1m 个项目的列表并不理想,因为这将导致从 0 到(在我的示例中)500,050 的每个项目的请求,从而加载所有表单数据库。

所以我的问题与上面发布的链接中丹尼尔的问题相同:

  • 为什么 DataGrid 多次请求项目(选定的项目被连续请求约 6-7 次,没有明显的原因)?

  • 有没有办法告诉 DataGrid 不要使用 Enumerator 并只获取选定的项目而不是从 0 开始迭代?

非常感谢,希望我有更多的运气至少能得到发人深省的答案,因为关于数据虚拟化的内容并不多。

0 投票
4 回答
1384 浏览

windows-phone-7 - 检测滚动到列表框的末尾

我有一个很大的项目列表,所以我应该从服务器请求相应的页面。当用户滚动到列表框的末尾时,如何捕获事件,以便我可以请求另一个页面?

0 投票
1 回答
175 浏览

c# - 数据虚拟化和用户并发

有没有人有任何关于如何解决使用数据虚拟化时在多用户场景中可能出现的许多问题的指针/示例。可以说我们正在谈论 WPF 和 DataGrid。实现按需加载的虚拟化集合并不太困难。但是,如果没有存储原始查询临时结果的暂存区,我们会遇到并发问题,例如:

  1. 加载新页面可能会获取不正确的数据(并发用户添加和删除一些记录,导致记录总数相同,但这会导致页面获取已显示在网格上方某处的重复条目)
  2. 在滚动和加载新页面时在网格中保留用户选择,一旦选定的项目从缓存中过期,一旦重新加载,我们就会发现有人删除了它们。我们可以取消选择所有内容并向用户显示消息,但是:/ 此外,如果在靠近列表末尾的某处使用 Shift-click(多选)进行选择,当某些项目“出现”在列表中间时应该做什么在加载一些中间页面时(并发用户添加的项目)。
0 投票
1 回答
454 浏览

winapi - 如何(以编程方式)获取 Windows UAC 虚拟化文件的位置?

我有一个 32 位 Windows 旧应用程序(使用 C/Win32 源代码),它在可执行文件所在的同一文件夹中创建其数据文件。

由于该应用程序没有安装程序,并且用户可以将可执行文件放在他/她想要的任何位置,因此该应用程序有一个对话框来通知用户其数据所在的位置。

但是在 Microsoft Vista/Seven 下,如果用户将应用程序放在 Program Files 或任何其他受系统保护的文件夹中,则数据文件会被虚拟化并移动到虚拟存储中。

如果在 Vista/Seven 下,我仍然想通知用户数据文件所在的位置:(不阻止清单文件中的虚拟化)

  1. 我如何(以编程方式)知道数据文件是否已虚拟化?或者如果可执行文件所在的文件夹意味着数据文件将被虚拟化?

  2. 假设我知道数据文件是虚拟化的,我怎么能(以编程方式)知道虚拟文件夹的位置,以在信息对话框中显示它?

我发现以下问题与我要问的问题非常接近,但它没有显示知道何时对文件进行虚拟化以及在何处进行虚拟化的解决方案(如果有)。

如何检测到 Windows VirtualStore 的文件重定向?

0 投票
1 回答
720 浏览

wpf - 如何计时 ListBox 加载时间 WPF

我正在玩 DataVirtualization 和 Async。我有哪些选项可以量化我将虚拟化数据集合绑定到的 ListBox 的加载时间?

我需要一种方法来比较虚拟化和非虚拟化数据加载。未能成功找到此主题的任何资源。

我应该在后面的代码中的 ListBox_Loaded 事件上放一个秒表吗?

提前致谢!