簡體   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