WPF ComboBox绑定大型集合时出现的性能问题

tquggr8v  于 2022-11-26  发布在  其他
关注(0)|答案(4)|浏览(187)

我尝试将一个大型集合绑定到ComboBox,但在打开ComboBox的弹出窗口时遇到了性能问题。我搜索了互联网,发现使用VirtualizingStackPanel作为项目面板模板可能会有帮助,但只是部分帮助。如果我将一个大型集合绑定到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" />

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

UPDATE:我考虑过不是每次都绑定新的集合,而是绑定一次ObservableCollection,然后只改变它的内容。同样的,只要集合的内容改变了,打开一个弹出窗口仍然需要几秒钟:(

7ivaypg9

7ivaypg91#

根据这个博客: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" />

我希望这对你有帮助。

4dc9hkyq

4dc9hkyq2#

我也遇到过性能缓慢的问题。但是我创建了一个继承Combobox的类,因此我想用编程的方式来做这个。所以这里是其他谷歌人的解决方案。

ItemsPanel = new ItemsPanelTemplate();
var stackPanelTemplate = new FrameworkElementFactory(typeof (VirtualizingStackPanel));
ItemsPanel.VisualTree = stackPanelTemplate;
bq8i3lrv

bq8i3lrv3#

我刚刚也遇到了这个问题。我在一个带有样式模板的自定义组合框中使用此代码。当我在VS调试模式下运行代码时,虚拟化无法正常工作。一旦我在调试之外运行代码,我就可以切换ObservableCollection的内容,而不会锁定UI。如果设置最大高度和最大宽度,这也可能会有所帮助。
第一个

3okqufwl

3okqufwl4#

从可用性的Angular 来看,使用一个标准的组合框,其中包含的项目超过了屏幕所能容纳的范围,这总是很麻烦的。它至少需要一个文本框过滤器。在许多情况下,可以对选项进行预过滤(例如,按部门、按首字母或范围),这样创建的对象更少,而且通常对用户更友好。

相关问题