繁体   English   中英

为什么在 DataGrid WPF 中打开下拉菜单时 ComboBoxColumn 非常慢?

[英]Why is the ComboBoxColumn very slow on drop-down open in DataGrid WPF?

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

我从数据库中的表中将超过 24,000 行加载到DataGridComboBoxColumn中,问题是当我打开 Combobox 时速度很慢,因此显示记录大约需要 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 打开 combobox 太慢了

我该如何解决这个问题↑?

类似的问题,但在 Templatecolumn: Combox column in wpf datagrid 性能问题

我无法测试下面的解决方案,它不适合评论,但似乎您正在尝试设置 VirtualizingStackPanel 的样式,而无需先为 ComboBox 创建一个样式。

首先定义您的 ItemsPanelTemplate:

<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 在进入编辑模式时被创建(初始化)..

这将有助于提高性能

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM