为什么在DataGrid WPF中下拉打开ComboBoxColumn的速度非常慢



我正在使用C#WPF,目前正在从Datagrid中的数据库加载一些数据。

我从数据库中的一个表中将24000多行加载到DataGridComboBoxColumn中,问题是当我打开组合框时,它非常慢,所以显示记录大约需要30秒

我在DataGridTemplateColumn中解决了这个问题,这里是XAML:

<DataGridTemplateColumn Header="ComboBox Element" Width="120">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox x:Name="ComboBox_Commodity"
ItemsSource="{Binding Path=TheCommodityCombo_DATA, RelativeSource={RelativeSource AncestorType=Window}}"
SelectedValue="{Binding CommodityID}"
DisplayMemberPath="CommodityName"
SelectedValuePath="CommodityCode"

IsTextSearchEnabled="True"
IsEditable="True"
SelectedIndex="0"  BorderBrush="#FFADEEB4" Background="{x:Null}" BorderThickness="1" PreviewLostKeyboardFocus="ComboBox_Commodity_PreviewLostKeyboardFocus">
<ComboBox.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel VirtualizingPanel.IsVirtualizing="True" VirtualizingPanel.VirtualizationMode="Recycling"/>
</ItemsPanelTemplate>
</ComboBox.ItemsPanel>
</ComboBox>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

但我不想使用DataGridTemplateColumn,因为在combobox元素中没有触发CellEndEdit事件

所以我使用DataGridComboBoxColumn

XAML:

<DataGridComboBoxColumn Width="160" Header="DataGridComboBoxColumn"
SelectedValueBinding="{Binding CommodityID}" 
DisplayMemberPath="CommodityName" 
SelectedValuePath="CommodityCode">
<DataGridComboBoxColumn.ElementStyle>
<Style TargetType="{x:Type ComboBox}">
<Setter Property="ItemsSource" Value="{Binding Path=TheCommodityCombo_DATA, RelativeSource={RelativeSource AncestorType=Window}}" />
</Style>
</DataGridComboBoxColumn.ElementStyle>

<DataGridComboBoxColumn.EditingElementStyle>
<Style TargetType="{x:Type ComboBox}">
<Setter Property="ItemsSource" Value="{Binding Path=TheCommodityCombo_DATA, RelativeSource={RelativeSource AncestorType=Window}}" />
<Setter Property="SelectedIndex" Value="0"/>
<Setter Property="IsEditable" Value="True"/>

<Setter Property="ScrollViewer.CanContentScroll" Value="True"/>
<Setter Property="VirtualizingStackPanel.IsVirtualizing" Value="True"/>
<Setter Property="VirtualizingStackPanel.VirtualizationMode" Value="Recycling"/>
</Style>
</DataGridComboBoxColumn.EditingElementStyle>
</DataGridComboBoxColumn>

我的问题是:我在DataGridTemplateColumn中进行的与ComboBox完全相同的设置不适用于DataGridComboBoxColumn!打开组合框时的DataGridComboBoxColumn 太慢了

我该如何修复↑ ?

类似的问题,但在Templatecolumn:wpf数据网格性能问题中的Combox列

我无法测试下面的解决方案,它不适合注释,但似乎您试图在没有为ComboBox创建VirtualizingStackPanel的情况下对其进行样式设置。

首先定义你的项目面板模板:

<Window.Resources>
<ItemsPanelTemplate x:Key="VSP">
<VirtualizingStackPanel IsVirtualizing="True" VirtualizationMode="Recycling"/>
</ItemsPanelTemplate>
</Window.Resources>

然后设置DataGridComboBoxColumn的ComboBox的样式以使用此ItemsPanelTemplate。

<Style TargetType="{x:Type ComboBox}">
<Setter Property="ItemsPanel" Value="{StaticResource VSP}" />

这应该用您配置的VirtualizingItemsPanel替换ItemsPanel。

来源:http://vbcity.com/blogs/xtab/archive/2009/12/15/wpf-using-a-virtualizingstackpanel-to-improve-combobox-performance.aspx

ComboBox元素可以触发CellEndEdit事件

ComboBox应包含在CellEditingTemplate中,而不是CellTemplate

<DataGrid ItemsSource="{Binding ItemList}" x:Name="dataGrid" CellEditEnding="dataGrid_CellEditEnding">
<DataGrid.Columns>
<DataGridTemplateColumn Header="ComboBox Element" Width="120">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding ItemList}"
IsEditable="True">
</ComboBox>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>

ComboBox是在进入编辑模式时创建的(已初始化(。。

它将有助于提高的性能

相关内容

  • 没有找到相关文章

最新更新