.net Listbox数据虚拟化和多选

.net Listbox数据虚拟化和多选,.net,wpf,listbox,multi-select,data-virtualization,.net,Wpf,Listbox,Multi Select,Data Virtualization,我有一个列表框,它可能包含大量带有支持数据的项。为了处理数据虚拟化,我通过编写一个集合来绑定WPF的UI虚拟化,该集合实现了与ObservableCollection相同的接口,并可以根据需要加速我们的备份数据 这个很好用。当我在列表框中引入multi-select时,问题就出现了。由于listbox按对象而不是索引SelectedItems管理选定项,因此选择所有项会导致listbox将所有备份数据旋转并保存在内存中,从而破坏数据虚拟化 除了重新编写ListBox以通过索引而不是对象管理选择之

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

这个很好用。当我在列表框中引入multi-select时,问题就出现了。由于listbox按对象而不是索引SelectedItems管理选定项,因此选择所有项会导致listbox将所有备份数据旋转并保存在内存中,从而破坏数据虚拟化

除了重新编写ListBox以通过索引而不是对象管理选择之外,是否有其他方法可以防止这种情况发生

谢谢


Eric

为什么不在UI控件上使用虚拟化选项?这将仅加载要在屏幕上显示的数据


我们使用UI虚拟化来控制我们的数据虚拟化,但是listbox在保留选择时遇到了问题,所以我们的数据没有被卸载


我最后做的是为虚拟化堆栈面板绑定到item generator,并侦听生成的容器的数据上下文更改事件。发生这种情况时,我要么从包装器中卸载了真实数据。

听起来您完全得到了想要的,因为您希望按需加载项目。为了选择所有需要加载的内容,对吗?TBH,我会覆盖CTRL-A选择列表框的所有部分,并将其绑定到一个不做任何事情的命令,基本上禁用它。我不确定是否可以通过绑定或者是否需要派生listbox的子类来实现这一点。我只希望实际可见的项目加载其数据,但我希望列表框保持选定索引列表,即使某个项目不在屏幕上,以便在其可见时将其选中。我也希望允许用户使用ctrl-a,我不想阻止他们选择所有项目。很抱歉,我无法访问要发布的代码,但我遇到了类似的情况,我所做的是移动到ListView,但我认为您可以使用ListBox单选并使用带有复选框的模板。这样,您就可以在项目级别处理复选框,而不需要ListBox来管理所选项目的集合。我这样做是为了更好地控制检查事件的处理,但我怀疑它也适用于虚拟化。在LostFocus事件中使用UpdateSourceTrigger=PropertyChanged,您可能会遇到ListItem消失的问题。至于ctrl-a,虚拟化将非常有趣。对于项目级复选框方法,我建议ctrl-a不起作用。如果复选框绑定到的类实现了INotify,则您可以选择集合中的所有项,UI将更新,但将其连接到ctrl-a可能会出现问题,因为某些控件不允许您覆盖其热键。这种方法是否能够多选择许多项,比如说70K?我甚至不知道UI为什么/如何一次选择这么多条目。然而,我不明白为什么它不能处理它。您可以通过UI手动选择条目,也可以通过代码调用选择条目。虚拟化只适用于控件在屏幕上的显示,而不适用于控件本身/内存中的备份数据。选择所有[Home],然后[Shift][Ctrl][End]工作得非常快。顺便说一句:我使用虚拟化列表框来显示日志文件的内容。现在,用户应该能够将它的一部分复制到剪贴板。