问题标签 [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 投票
2 回答
2709 浏览

wpf - MVVM 与数据虚拟化

我有一个绑定到 ViewModel 实例树的 TreeView。问题是模型数据来自一个缓慢的存储库,所以我需要数据虚拟化。仅当父树视图节点展开时才应加载节点下方的子 ViewModel 列表,并应在折叠时卸载它。

在遵守 MVVM 原则的同时如何实现这一点?ViewModel 如何获得需要加载或卸载子节点的通知?那是在不知道树视图存在的情况下展开或折叠节点的时候?

有些东西让我觉得数据虚拟化与 MVVM 不兼容。由于在数据虚拟化中,ViewModel 通常需要了解很多关于 UI 的当前状态,并且还需要控制 UI 中的很多方面。再举一个例子:

具有数据虚拟化的列表视图。ViewModel 需要控制 ListView 的滚动拇指的长度,因为它取决于模型中的项目数。此外,当用户滚动时,ViewModel 需要知道他滚动到哪个位置以及列表视图有多大(当前适合多少项)才能从存储库加载模型数据的正确部分。

0 投票
3 回答
3219 浏览

silverlight - 如何在不使用分页的情况下实现延迟加载的 Silverlight 数据网格

使用全新发布的 RIA 服务中的业务应用程序模板,您可以看到大量使用 a 顶部的数据网格DomainDataSourceDataPager. 属性 PageSize 和 LoadSize 可用于调整要在一页中显示的数据量以及在后台预取的数据量。

现在我想要一个带有滚动条且没有寻呼机的数据网格。底层DomainDataSource应该只加载显示在网格中的数据。当用户向下滚动到尚未在数据上下文中的项目时,它应该触发另一个加载。是否有任何示例实现如何做到这一点?

0 投票
2 回答
404 浏览

windows-phone-7 - 在 Windows Phone 7 中虚拟化数据:一个示例

在 Windows Phone 中,ListBox 支持数据的虚拟化,这意味着它只能加载需要的数据,而不是所有的数据。Peter Torr解释了您需要实现的接口。

简短的版本是您必须创建一个返回元素位置的方法和另一个返回特定位置的元素的方法。问题是 Peter Torr 的例子相当愚蠢,他只是返回一个以索引为名称的对象。

我的问题是:您如何实际实现这一点?

我的想法是创建一个文件,其中包含一个(整数)索引和一个(整数)id 的列表以及一个包含实际数据的每个对象的文件。这似乎不是一个真正优雅的想法,但我想不出更好的办法,你能吗?

更新

看来我的问题不准确。当我说彼得·托尔的例子“相当愚蠢”时,我并不是说他做错了什么;而是说他做错了什么。他的目的只是解释你需要实现什么接口。实际实施将取决于具体数据。

我要问的是我有什么选择来实现这个?我是否应该简单地将数据放在 Web 服务上并每次都查询它(当然,使用本地缓存),构建数据库,创建一个文件来存储索引和一个用于数据的文件?在每种情况下都有足够好的解决方案吗?每个选择的优缺点是什么?

0 投票
1 回答
4241 浏览

c# - 使用Data Virtualization,ViewModel中的属性与View中ItemsControl的SelectedItem绑定的问题

关于 WPF 中的数据虚拟化,WPF:数据虚拟化是一篇好文章。

使用它,数据虚拟化在我的代码中执行得很好,但有一个问题,即我无法将 ViewModel 中的属性与 View 中 ItemsControl 的 SelectedItem 绑定。数据加载时,如果某一项数据满足某个条件,则该项会在ViewModel中设置为属性,然后与View中ItemsControl的SelectedItem绑定,但不绑定。

我的代码如下。关于 IItemsProvider 和 VirtualizingCollection 的类型,请参考WPF:数据虚拟化

到目前为止,我已经尝试过:

  1. 我敢肯定,如果不使用 Data Virtualization,Selected Item Binding 会很酷。
  2. VirtualizingCollection 中的 IndexOf(T item) 方法始终返回 -1。由于认为这是问题所在,我实现了 IndexOf(T item) 返回一个实际索引,但它并不关心这个问题。

实现 IItemsProvider 的代码

ViewModel中使用VirtualizingCollection的代码

0 投票
1 回答
1075 浏览

c# - WPF AutoCompleteBox 数据虚拟化

我正在尝试在 WPF AutoCompleteBox 上实现数据虚拟化。我在这里找到了 Bea Stollnitz 的代码,它在 ListView 上工作得很好,而且我很容易让它在 ComboBox 上工作,但我似乎无法让它在 AutoCompleteBox 上正常工作。

准确地说,它是有效的——列表是虚拟化的,项目并不是在启动时全部加载——但似乎发生的是,一旦 ItemsSource 发生变化,AutoCompleteBox 就会遍历列表中的所有项目,这最终会破坏整个事情(即在加载时,列表中的所有页面都被请求,因此即使它们被虚拟化,它们也会在开始时被请求并被加载)。我的猜测是这是因为 ACBox 进行了过滤,但我很惊讶没有办法阻止它,因为控件通常允许使用 Populating 事件在服务器端进行过滤。

我觉得我错过了一些东西,我不敢相信以前没有人做过这样的事情或者无法做到,所以我猜我只是在做一些我可以做的明显错误的事情不知道,因为我是 WPF 的新手。

以下是我为尝试将其整合在一起所做的一些事情(基于围绕类似问题的 Internet 搜索):

  • 我确保内置 UI 虚拟化的所有条件都可以,包括显式打开它、设置 ListBox 的最大高度等。

  • 我用 Bea 在她的示例中使用的 ListView 替换了 AutoCompleteBox 中的 ListBox。并排地,ListView 本身按预期工作,但嵌入在 ACBox 中的却没有。

  • 我尝试在 ACBox 中不使用过滤,使用自定义过滤器,手动处理填充事件等。这没有帮助。制作自定义过滤器显然是不够的,因为自定义过滤器只允许您指定评估一项的结果,循环遍历列表的代码是不可见的,因此您无法阻止循环。将过滤器设置为“无”也无济于事。

欢迎任何和所有建议!

目标是 .NET 3.5,我正在使用 WPF 工具包(2010 年 2 月发布)

谢谢!

0 投票
2 回答
903 浏览

c# - Wpf 数据虚拟化

我正在尝试将相当大的项目列表加载到 WPF DataGrid 中。问题是:它非常缓慢。现在,我的列表中有大约 20,000 个项目,而且需要很长时间(嗯……在我的最新版本中,大约需要 10 秒,但这还不够好)。最近几天我一直在研究它,但我没有找到真正有效的解决方案。

1)当然启用了UI虚拟化(这不再是问题了)

2)我还尝试了 Bea Stollnitz在这里和其他人描述的一些解决方案。这些解决方案很棒,但对我不起作用,因为我的集合必须在运行时更新、过滤和排序,而无需重新加载集合。我找到的解决方案仅适用于 IList 实现......我需要一个 Observable 集合来使我的项目保持最新。

情况就是这样:我确实有我的域数据对象的 Observable 集合(它通过 WCF 异步更新)。我确实有一个 ViewModel 用于包装域对象的列表项。当我打开视图时,我有第二个列表,其中将填充每个域对象的 ViewModel 实例。这是真正的问题。由于“目标”集合绑定到我的 DataGrid,我必须将 ViewModels 的创建分派到 UI 线程(否则 .Net 对来自另一个线程的集合更改不太满意)。所以我用 20,000 个视图模型创建调用污染了 Dispatcher 队列。创建 ViewModel 非常便宜,但调度程序队列中仍有 20,000 个调用,同时 DataGrid 要求同一线程中的 CPU 来填充自己。

我的想法(还没有完成):因为我已经有了 UI 虚拟化,所以我不想在打开视图时创建 ViewModel,而是在运行时需要它们。当用户最初可以看到前 20 个条目时,我只需要创建 20 个 ViewModel 而不是 20,000 个。这是我的问题:我不知道怎么做。那就是你进来的地方:)

我想要这样的东西(不是那样工作..只是为了说明我的意思):

它不一定是转换器,也可以是其他东西或在后面的代码中完成。我不在乎。我需要的是:直接绑定到 DomainObject 集合,动态创建相应的 ViewModel,并使用刚刚创建的 ViewModel 而不是原始对象来填充单行。有任何想法吗?

0 投票
2 回答
1846 浏览

c# - C# 中的 WinRT 数据虚拟化实现

在 MSDN 论坛上问过这个问题(没有成功),也许 StackOverflow 会再证明一次它的实力......

我参加了Hamid Mahmood关于收集和列出应用程序的会议,很高兴看到对数据虚拟化的控制级支持。不幸的是,没有给出关于如何实现IVirtualizingVectorIIncrementalLoadingVector的详细信息,并且通过查看接口本身也不清楚如何做到这一点。任何人都可以发布样本吗?

SO的额外奖励问题 - 是否有比“从头开始”编码更简单的方法来实现 IAsyncOperation(IIncrementalLoadingVector 实现需要)?

0 投票
2 回答
1131 浏览

.net - 列表框数据虚拟化和多选

我有一个列表框,它可能包含大量带有支持数据的项目。为了处理数据虚拟化,我通过编写一个实现与 ObservableCollection 相同的接口并可以根据需要启动我们的支持数据的集合来绑定到 WPF 的 UI 虚拟化。

这工作正常。当我使用列表框引入多选时,问题就来了。因为列表框通过对象而不是索引(SelectedItems)管理选定的项目,所以选择所有项目会导致所有支持数据被列表框旋转并保存在内存中,从而破坏了数据虚拟化......

除了重写 ListBox 以通过索引而不是对象管理选择之外,有没有办法防止这种情况发生?

谢谢!

埃里克

0 投票
1 回答
1124 浏览

wpf - 如何使用来自数据库的数据实现 WPF DataVirtualization?

我有一个连接到 WCF 服务的应用程序,该服务从 SQL Server 数据库存储过程中收集数据。在 UI 方面,我已经阅读了很多关于使用 DataVirtualization 以优化显示大量数据的文章。

但是在阅读了很多之后,我不清楚我应该如何为来自我的数据库的数据实施这样的解决方案。

我是否必须从表中调用一次我的所有记录,然后从 UI 端处理整个虚拟化,还是数据库应该已经返回 PAged 记录?

如果你们中的一些人在 UI 端有 SQl 数据和虚拟化的示例实现或显示这一点的良好链接,我会很高兴。

对于时间beeing,我已经看到了带有示例收集演示的示例项目,但没有针对数据库的东西。

0 投票
1 回答
1238 浏览

wpf - WPF 数据虚拟化

我有一个 WPF DataGrid,其数据来自存储过程。我想知道如何虚拟化这些数据?我正在使用 ADO.NET 实体框架。我在数据库中的数据会定期更改,需要通过我的存储过程定期获取。提前致谢。