- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用带有 CellEditingTemplates
的 DataGrid
。作为 ItemsSource
,使用了一个数据虚拟化集合(AlphaChiTech 解决方案),它一次只能按需获取 100 个项目大小的页面。
在双击单元格进入编辑表单之前效果很好,然后 VirtualizingStackPanel
一个接一个地请求所有项目。当然,作为副作用,最终会请求所有页面。
有没有办法解决这个问题?
编辑:
我找到了一个解决方法,它可能会帮助处于我这种情况的人:
最后我观察到在切换到编辑表单后,在行高保持不变的情况下,VirtualizingStackPanel 并没有请求所有项目。在解决方法之前,我的编辑表格略高。
现在我设置单元格中控件的 MinHeight(正常和编辑),这样在切换到编辑表单时高度不会改变。
不幸的是,这只在特定条件下有效。在某些情况下它不起作用:
使用 RowDetailsTemplate
。一旦它可见,虚拟化就会被破坏。我假设行详细信息属于行本身,因此行高再次增加。
分别在 CollectionView 中引发 Collection 的 Reset 事件。根据我的经验,这通常是使用 DataGrids
进行数据虚拟化的 killer 。
减少集合的 Count
(这也不会对 Reset 事件造成问题)。
有趣的是,增加集合的 Count
确实有效。但我必须增强 AlphaChiTech 的功能(幸运的是源代码在 github 上),因为没有办法在不引发开箱即用的重置事件的情况下更改 Count
(至少我没有找到)。此外,DataGrid 的
项必须在之后立即刷新,否则将引发异常,说明 ItemsControl
和集合确实具有不一致的状态。
行详细信息对我来说是可选的,但在不破坏数据虚拟化的情况下删除项目是至关重要的。因此,问题仍然存在。我的解决方法很可能会帮助那些拥有固定大小集合的人,但不幸的是我不会。
最佳答案
解决方法
我自己找到了解决此问题的解决方案。此变通方法适用于在 WPF 中使用数据虚拟化的可编辑集合(无需变通方法即可实现数据虚拟化的只读集合)。
首先,行必须是统一大小的。我的问题之一是 CellEditingTemplates
高于 CellTemplates
。因此,每次触发编辑表单时,DataGrid
都会获取集合中的所有项目。将 CellTemplates
的 MinHeight
设置为与 CellEditingTemplates
的高度匹配就可以了。
显然,RowDetailsTemplate
属于行,因此当可见时,它会更改行的高度,从而破坏数据虚拟化。因此,最好不要使用行详细信息并使用主从模式,其中“详细信息”显示在 DataGrid
之外。后者我现在正在尝试实现(第一次未完全实现的尝试效果很好,足以说明这不会造成任何麻烦)。我确实想到了行详细信息的一个异常(exception):如果行详细信息始终可见并且每个项目都具有相同大小的行详细信息,那么它可能会起作用。这个想法是行的高度然后是统一大小的,但在我的应用程序中,整个集合中只有少数项目需要详细信息,我没有尝试这种方法。
其次,减少计数 - 意味着删除项目 - 并重置集合或 DataGrid
上的项目也会触发所有项目的获取。此处的解决方法是在添加或删除项目时,用相同项目的新集合对象替换现有集合。幸运的是,这个新系列也是数据虚拟化的。所以它仍然是省时的,流畅的,用户不会注意到它。但是,如果在 DataGrid
中选择了一个项目时执行这样的“刷新”,仍然会有问题。这是一个令人讨厌的解决方法:我在管理虚拟化集合的 ViewModel
中实现了两个事件。它们是 PreVirtualizedRefresh
和 PostVirtualizedRefresh
。带有 DataGrid
的 View
订阅它们并在 PreVirtualizedRefresh
和 上取消选择
可能会再次选择取消选择的项目索引(如果已记住)。后来一个仍然不适合我。 DataGrid
中的每个项目PostVirtualizedRefresh
重要的是,有了这些解决方法(使用备用主从模式并使用新的集合对象刷新并取消选择项目),数据虚拟化将不会被破坏。
备注
在我处理这些问题时尝试过的所有虚拟化解决方案中,我认为 AlphaChi 解决方案是最好的。
WPF 绝对不是在考虑数据虚拟化的情况下构建的。另一方面,它的继任者 UWP 甚至有自己的数据虚拟化接口(interface)。因为我没有任何 UWP 项目,所以我无法亲自尝试,但我想这会很有趣。话虽如此,UWP 没有原生的 DataGrid
,因此数据虚拟化集合必须提供给 Lists
或第三方 DataGrids
.因此也需要权衡。
关于c# - WPF - VirtualizingStackPanel 在 DataGrid 中进入编辑模式时请求所有项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35688046/
对此感到疯狂,真的缺少一些东西。 我有webpack 4.6.0,webpack-cli ^ 2.1.2,所以是最新的。 在文档(https://webpack.js.org/concepts/mod
object Host "os.google.com" { import "windows" address = "linux.google.com" groups = ["linux"] } obj
每当我安装我的应用程序时,我都可以将数据库从 Assets 文件夹复制到 /data/data/packagename/databases/ .到此为止,应用程序工作得很好。 但 10 或 15 秒后
我在 cc 模式缓冲区中使用 hideshow.el 来折叠我不查看的文件部分。 如果能够在 XML 文档中做到这一点就好了。我使用 emacs 22.2.1 和内置的 sgml-mode 进行 xm
已结束。此问题不符合 Stack Overflow guidelines .它目前不接受答案。 我们不允许提出有关书籍、工具、软件库等方面的建议的问题。您可以编辑问题,以便用事实和引用来回答它。 关闭
根据java: public Scanner useDelimiter(String pattern) Sets this scanner's delimiting pattern to a patt
我读过一些关于 PRG 模式以及它如何防止用户重新提交表单的文章。比如this post有一张不错的图: 我能理解为什么在收到 2xx 后用户刷新页面时不会发生表单提交。但我仍然想知道: (1) 如果
看看下面的图片,您可能会清楚地看到这一点。 那么如何在带有其他一些 View 的简单屏幕中实现没有任何弹出/对话框/模式的微调器日期选择器? 我在整个网络上进行了谷歌搜索,但没有找到与之相关的任何合适
我不知道该怎么做,我一直遇到问题。 以下是代码: rows = int(input()) for i in range(1,rows): for j in range(1,i+1):
我想为重写创建一个正则表达式。 将所有请求重写为 index.php(不需要匹配),它不是以/api 开头,或者不是以('.html',或'.js'或'.css'或'.png'结束) 我的例子还是这样
MVC模式代表 Model-View-Controller(模型-视图-控制器) 模式 MVC模式用于应用程序的分层开发 Model(模型) - 模型代表一个存取数据的对象或 JAVA PO
我想为组织模式创建一个 RDF 模式世界。您可能知道,组织模式文档基于层次结构大纲,其中标题是主要的分组实体。 * March auxiliary :PROPERTIES: :HLEVEL: 1 :E
我正在编写一个可以从文件中读取 JSON 数据的软件。该文件包含“person”——一个值为对象数组的对象。我打算使用 JSON 模式验证库来验证内容,而不是自己编写代码。符合代表以下数据的 JSON
假设我有 4 张 table 人 公司 团体 和 账单 现在bills/persons和bills/companys和bills/groups之间是多对多的关系。 我看到了 4 种可能的 sql 模式
假设您有这样的文档: doc1: id:1 text: ... references: Journal1, 2013, pag 123 references: Journal2, 2014,
我有这个架构。它检查评论,目前工作正常。 var schema = { id: '', type: 'object', additionalProperties: false, pro
这可能很简单,但有人可以解释为什么以下模式匹配不明智吗?它说其他规则,例如1, 0, _ 永远不会匹配。 let matchTest(n : int) = let ran = new Rand
我有以下选择序列作为 XML 模式的一部分。理想情况下,我想要一个序列: 来自 my:namespace 的元素必须严格解析。 来自任何其他命名空间的元素,不包括 ##targetNamespace和
我希望编写一个 json 模式来涵盖这个(简化的)示例 { "errorMessage": "", "nbRunningQueries": 0, "isError": Fals
首先,我是 f# 的新手,所以也许答案很明显,但我没有看到。所以我有一些带有 id 和值的元组。我知道我正在寻找的 id,我想从我传入的三个元组中选择正确的元组。我打算用两个 match 语句来做到这
我是一名优秀的程序员,十分优秀!