我试图将一个大集合绑定到ComboBox上,但是在打开ComboBox的弹出窗口时遇到了性能问题。我搜索了互联网并发现,使用VirtualizingStackPanel作为项面板模板可能有所帮助,但只在某种程度上有所帮助。如果我将一个大集合绑定到ComboBox上,我可以很快地打开弹出窗口,这没有问题,但如果在此之后我将另一个集合绑定到ComboBox上并尝试再次打开弹出窗口,则会变得非常慢。如果您打开一个空ComboBox的弹出窗口,然后绑定大集合并再次尝试打开弹出窗口,则需要几秒钟才能打开弹出窗口。
以下是XAML代码:
<ComboBox Name="cbBlah">
<ComboBox.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel />
</ItemsPanelTemplate>
</ComboBox.ItemsPanel>
</ComboBox>
并且绑定重现问题的示例代码:
var list = new List<string>();
for (var i = 0; i < new Random().Next(9000, 10000); i++)
list.Add(i.ToString());
cbBlah.ItemsSource = list;
我试图让虚拟化的堆栈面板看起来像这样:
<VirtualizingStackPanel VirtualizingStackPanel.IsVirtualizing="True" VirtualizingStackPanel.VirtualizationMode="Recycling" />
但是这并没有起到帮助的作用,似乎虚拟化模式被忽略了,所以弹出窗口只在第一次打开时非常快,然后每次绑定更改后,速度都非常慢。
更新:我考虑过不每次绑定新的集合,而是绑定一个ObservableCollection一次,然后仅更改其内容。同样的问题,一旦集合的内容发生变化,打开弹出窗口仍然需要几秒钟 :(