我正在尝试将大型集合绑定到ComboBox,并且在打开ComboBox的弹出窗口时遇到了性能问题.我搜索了互联网,发现使用VirtualizingStackPanel作为项目面板模板可能有所帮助,但它只能帮助部分.如果我将一个大型集合绑定到一个ComboBox,我可以非常快速地打开弹出窗口,这没关系,但如果之后我将另一个集合绑定到一个ComboBox并尝试再次打开弹出窗口,它会变得非常慢.如果您为空ComboBox打开弹出窗口,然后绑定大型集合并尝试再次打开弹出窗口,则会发生同样的情况 - 弹出窗口打开前需要几秒钟.
这是XAML:
<ComboBox Name="cbBlah">
<ComboBox.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel />
</ItemsPanelTemplate>
</ComboBox.ItemsPanel>
</ComboBox>
Run Code Online (Sandbox Code Playgroud)
和绑定的示例代码重现问题:
var list = new List<string>();
for (var i = 0; i < new Random().Next(9000, 10000); i++)
list.Add(i.ToString());
cbBlah.ItemsSource = list;
Run Code Online (Sandbox Code Playgroud)
我试图使虚拟化堆栈面板看起来像这样:
<VirtualizingStackPanel VirtualizingStackPanel.IsVirtualizing="True" VirtualizingStackPanel.VirtualizationMode="Recycling" />
Run Code Online (Sandbox Code Playgroud)
但它没有帮助,似乎忽略了VirtualizationMode,因此弹出窗口仅在第一次打开非常快,然后,每次绑定更改后,它都非常慢.
更新:我想过每次都没有绑定新的集合,但是绑定一次ObservableCollection然后只是改变它的内容.同样的事情,一旦收集内容发生变化,打开一个弹出窗口仍然需要几秒钟:(