gpt4 book ai didi

WPF ComboBox 通过绑定(bind)大型集合而出现性能问题

转载 作者:行者123 更新时间:2023-12-01 19:02:14 25 4
gpt4 key购买 nike

我正在尝试将大型集合绑定(bind)到组合框,但在打开组合框的弹出窗口时遇到性能问题。我搜索了互联网,发现使用 VirtualizingStackPanel 作为项目面板模板可能会有所帮助,但它只提供了部分帮助。如果我将一个大集合绑定(bind)到一个组合框,我可以非常快地打开弹出窗口,那没关系,但是如果之后我将另一个集合绑定(bind)到一个组合框并尝试再次打开弹出窗口,它会变得非常慢。如果您为空的 ComboBox 打开弹出窗口,然后绑定(bind)大集合并尝试再次打开弹出窗口,则会发生同样的情况 - 弹出窗口打开之前需要几秒钟的时间。

这是 XAML:

<ComboBox Name="cbBlah">
<ComboBox.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel />
</ItemsPanelTemplate>
</ComboBox.ItemsPanel>
</ComboBox>

以及用于重现问题的绑定(bind)示例代码:

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" />

但这没有帮助,似乎 VirtualizationMode 被忽略,因此弹出窗口仅第一次打开得非常快,然后,每次绑定(bind)更改后,它都非常慢。

更新:我考虑过不要每次都绑定(bind)新的集合,而是绑定(bind)一次 ObservableCollection ,然后只更改其内容。同样的事情,一旦集合内容发生变化,打开弹出窗口仍然需要几秒钟:(

最佳答案

根据此博客:http://vbcity.com/blogs/xtab/archive/2009/12/15/wpf-using-a-virtualizingstackpanel-to-improve-combobox-performance.aspx

我用这段代码测试了它:

<ComboBox Name="cbBlah" ItemsSource="{Binding}">
<ComboBox.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel />
</ItemsPanelTemplate>
</ComboBox.ItemsPanel>
</ComboBox>

第一次和下一次都工作得很好。没有必要对这些行进行编码:

<VirtualizingStackPanel VirtualizingStackPanel.IsVirtualizing="True" VirtualizingStackPanel.VirtualizationMode="Recycling" />

关于WPF ComboBox 通过绑定(bind)大型集合而出现性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8198645/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com