【发布时间】:2011-12-23 09:19:43
【问题描述】:
我有一个数据网格,其中有一列组合框定义如下:
<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 行,尝试使用其他地方建议的 virtualizingstackpanel 没有区别。显示它的数据网格大约有 10 行,因此它甚至不会接近任何需要洗牌的大量数据。
编辑:关于无法使用定义 QualityItemCollection 的更多解释。上述数据网格中的所有项目的 QualityItemColletion 都是相同的,但有关应选中哪些复选框的信息是在上述网格中的每个项目中设置的。因此,我将 QualityItemCollection 的副本复制到 QualityItemAssortmentCollection 中,该复选框也有一个布尔值。可能有更好的方法来做到这一点?
编辑 2: 现在尝试了 WPF 分析器,它就像程序一样锁定,并且在程序执行奇怪的事情期间不显示任何内容。但是,它变成了 Visual Studio 所做的事情,因为如果我单独运行程序而不是通过 Visual Studio 运行程序,则不会有延迟。耶。
【问题讨论】:
-
我没有得到这个...
The texts for the textbox in the combobox is however editable in another datagrid, and to get the comboboxes in the grid above updated I have an event on the datagrid that fires when that collection is changed....如果集合是可观察的,那么为什么你不能修改它。我无法理解你所说的那个事件的目的。 -
试图解释得更好一点。
标签: wpf performance datagrid combobox