列表框数据虚拟化和多选

3
我有一个列表框,可能会有大量带有后台数据的项目。为了处理数据虚拟化,我已经通过编写一个实现与ObservableCollection相同接口的集合来连接到WPF的UI虚拟化,并可以根据需要启动我们的后台数据。
这很好用。问题出现在当我引入列表框的多选时。因为列表框通过对象而不是索引(SelectedItems)管理所选项目,选择所有项目会导致列表框将所有后台数据启动并保存在内存中,从而打败数据虚拟化......
除了重新编写ListBox以通过索引而不是对象管理选择之外,是否有其他方法防止这种情况发生?
谢谢!
Eric

看起来你得到了你想要的,因为你希望项目按需加载。要“全选”,必须将它们加载,对吧?老实说,我会覆盖列表框的CTRL-A(全选)并将其绑定到不执行任何操作的命令(基本上是禁用它)。无论你是通过绑定还是需要派生一个列表框子类来实现这一点,我都不确定。 - Bahri Gungor
不完全正确。我只想要实际可见的项目加载他们的数据,但是即使一个项目在屏幕外,我希望列表框维护所选的索引列表以便在它变得可见时被选中。我确实希望用户也可以使用Ctrl-A,我不想阻止他们选择所有项目。 - esc861
抱歉,我没有访问代码进行发布,但我遇到了类似的情况,我所做的是转移到ListView(但我认为您可以使用ListBox)单选并使用带有复选框的模板。这样,您就可以在项目级别处理检查(选择),而不需要ListBox管理所选项目的集合。我这样做是为了更好地控制处理Check事件,但我怀疑它也适用于虚拟化。使用UpdateSourceTrigger = PropertyChanged,因为使用LostFocus事件可能会导致ListItem消失的问题。 - paparazzo
关于虚拟化,ctrl-a会非常有趣。而且,如果我建议的项目级复选框方法,ctrl-a将无法使用。如果复选框绑定到的类实现了INotify,则可以选择集合中的所有项,并且UI将更新,但将其连接到ctrl-a可能会成为问题,因为某些控件不允许您覆盖它们的热键。 - paparazzo
2个回答

0

这种方法能够多选很多条目吗,比如说70K? - Wolf
我甚至不确定为什么/如何UI希望一次选择那么多条目。但是,我不认为它不能处理。您可以通过UI手动选择条目(需要很长时间),或通过代码调用来选择条目。虚拟化仅适用于在屏幕上显示控件-而不是控件本身/后备数据在内存中。 - tsells
好的,我刚刚尝试了使用一百万个项目(仅使用索引作为数据文本)。选择所有项([Home] 然后 [Shift][Ctrl][End])的速度非常快。顺便说一下:我使用虚拟化列表框来显示日志文件的内容。现在,用户应该能够将其中的部分复制到剪贴板中。 - Wolf

0
我们曾经使用UI虚拟化来控制数据虚拟化,但是在ListBox保持选择方面遇到了问题,因此我们的数据没有被卸载。
我最终做的是将其连接到虚拟化堆栈面板的项生成器,并监听生成的容器的数据上下文更改事件。当发生这种情况时,我要么从我们的包装器中卸载真实数据。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接