更改ItemsSource后的Combobox性能

时间:2011-12-23 09:19:44

标签: wpf performance datagrid combobox

我有一个数据网格,其中一列组合框定义如下:

<DataGridTemplateColumn x:Name="AssortmentQualitySettingsDataGridColumn" Header="Kvaliteter">
<DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
        <ComboBox ItemsSource="{Binding Path=QualityInfoAssortmentCollection}">
            <ComboBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <CheckBox IsChecked="{Binding Path=ActiveQuality}"></CheckBox>
                        <TextBlock Text="{Binding Path=QualityName}" IsEnabled="False"></TextBlock>
                    </StackPanel>
                </DataTemplate>
            </ComboBox.ItemTemplate>
        </ComboBox>
    </DataTemplate>
</DataGridTemplateColumn.CellTemplate>

ItemsSource是ObservableCollection对象。然而,组合框中文本框的文本可以在另一个数据网格中编辑,并放入另一个名为QualityItemCollection的ObservableCollection中,并且为了使上面网格中的组合框更新,我在数据网格上有一个事件,当该集合被更改时触发。这甚至会导致重新读取QualityInfoAssortmentCollection(组合框也需要再次设置,因此有一些循环可以使其工作)。

现在,发生的事情是,第一次加载数据时,一切都很好而花花公子,但是,当事件更新QualityInfoAssortmentCollection已经触发上面的组合框时,在尝试进入它时需要5-7秒才能下拉。刷新本身我有时间,只需不到十分之一秒。组合框没有超过8-10行,并且尝试使用其他地方建议的虚拟化堆叠面板没有区别。显示它的数据网格大约有10行,因此它甚至不能接近需要洗牌的大量数据。

编辑:有关无法使用定义的QualityItemCollection的更多说明。对于上述数据网格中的所有项目,QualityItemColletion都是相同的,但是应该检查哪些复选框的信息是在上面网格中的每个项目上设置的。因此,我将QualityItemCollection的副本复制到QualityItemAssortmentCollection中,该副本也有一个bool。可能有更好的方法来做到这一点?

编辑2: 现在尝试了WPF探查器,它就像程序一样锁定,并且在程序执行奇怪的事情时不会显示任何内容。然而,它变成了Visual Studio所做的事情,因为如果我单独运行程序而不是通过Visual Studio,那么就没有延迟。耶。

2 个答案:

答案 0 :(得分:4)

VS调试器出了问题。它出于某种原因使得组合框变得极其缓慢。

答案 1 :(得分:1)

那么,解决它?

  

当更新QualityInfoAssortmentCollection的事件触发上面的组合框时需要5-7   试图进入它时,秒数下降。

它在哪里花时间?它不像周围没有分析器。这完全有可能与WPF相关,在这种情况下这个链接:

http://msdn.microsoft.com/en-us/library/aa969767.aspx

还可以使用WPF级别分析器(例如,您可以看到WPF花费时间的位置,这可能是某些WPF定义中的某些错误)。

您也可能发送太多不可识别的更新事件(在发送更新通知之前,应始终更改值是否已更改)。因此,upate可能会将属性更新为触发另一个更新的相同值。分析器将允许您找到这些出现。

这里没有人可以帮助你 - 没有代码等。但是一个分析器应该在时间花费的地方明确地说明。