gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 02:21:33 25 4
gpt4 key购买 nike

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

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

关于解决方案

我最终写了一个 list 来完成所有繁重的工作。它是一个名为 VirtualList<T>. 的泛型类。它实现了 ICollectionViewFactory接口(interface),所以 Collection View 创建机制可以创建一个VirtualListCollectionView<T>实例来包装它。此类继承自 ListCollectionView .我没有按照建议编写自己的 ICollectionView执行。继承似乎也可以正常工作。
VirtualList<T>将整个数据拆分为页面。它获取总项目数,每次 DataGrid通过列表索引器请求一行,它会加载相应的页面或从缓存中返回它。里面的页面被回收了,一个DispatcherTimer在空闲时间处理未使用的页面。

数据请求模式

  • 我学到的第一件事是 VirtualList<T>应该执行IList (非通用)。否则 ItemsControl将其视为 IEnumerable并查询/枚举所有行。这是合乎逻辑的,因为 DataGrid不是类型安全的,所以它不能使用 IList<T>界面。
  • DataGrid 经常询问索引为 0 的行。 .它似乎用于视觉项目测量(根据调用堆栈)。所以,我只是缓存这个。
  • DataGrid 中的缓存机制使用可预测的模式来查询它显示的行。首先它从上到下询问可见行(每行两次),然后在可见区域(包括第一个可见行)之前以降序查询几行(取决于可见区域的大小)顺序如此,从下到上。之后,它从上到下在可见行(包括最后一个可见行)之后请求相同数量的行。

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

    如果我的页面大小设置正确,我可以从当前和以前加载的页面中处理所有这些请求。
  • 如果 CanSelectMultipleItemsTrue并且用户使用 SHIFT 按钮或鼠标拖动选择多个项目,DataGrid枚举从列表开头到所选内容结尾的所有行。此枚举通过 IEnumerable 进行。接口(interface)不管IList实现与否。
  • 如果所选行不可见并且当前可见区域与所选行“远”,则有时 DataGrid 会开始请求从所选行到可见区域末尾的所有项目。包括其间的所有行,甚至不可见。我无法弄清楚这种行为的确切模式。也许我的实现是原因。

  • 我的问题
  • 我想知道,为什么 DataGrid对不可见行的请求,因为这些行将在变为可见时再次被请求?
  • 为什么需要每行请求两三次?
  • 谁能告诉我如何使 DataGrid 不使用 IEnumerable ,除了关闭多项选择?
  • 最佳答案

    我至少找到了一些欺骗 VirtualList 的方法。您可以阅读 here .

    如果您找到了另一种解决方案(甚至比我的更好),请告诉我!

    关于wpf - 具有数据虚拟化的 DataGrid 行请求模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12248633/

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