DataGridComboboxColumn的性能问题

时间:2016-04-18 22:07:23

标签: c# wpf devexpress

我是WPF和devexpress的新手,我目前正在重新实现一个应用程序。我的目标是删除WPF应用程序中对devexpress的所有引用,并仅使用WPF替换它

现在我有了这个DataGridComboBoxColumn,其目的是将员工绑定到帖子(例如项目经理)。在这个组合框中有大约3000个项目。当应用程序使用GridControl时,没有性能问题(UI呈现期间没有减速)。它只是使用GridControl和ComboBoxEdit作为其中一列的控件模板。

在WPF中,我将其替换为:

`<DataGrid x:Name="gridProject" AutoGenerateColumns="False" CanUserAddRows="True"
      ItemsSource="{Binding Source={StaticResource ProjectCollectionView}}"
      SelectionMode="Single"
      EnableRowVirtualization="True"
      EnableColumnVirtualization="True"
      VirtualizingStackPanel.IsVirtualizing="True"
      VirtualizingStackPanel.VirtualizationMode="Recycling"
      RowHeight="25">


<!-- How to display the person: "NAME FirstName" -->
<DataGrid.Resources>
    <DataTemplate x:Key="displayFullNameTemplate">
        <StackPanel Orientation="Horizontal">
            <TextBlock Text="{Binding Name, Mode=OneWay, IsAsync=True}"></TextBlock>
            <TextBlock Text=" "></TextBlock>
            <TextBlock Text="{Binding FirstName, Mode=OneWay, IsAsync=True}"></TextBlock>
        </StackPanel>
    </DataTemplate>
    <ItemsPanelTemplate x:Key="virtualizeItemsPanelTemplate">
        <VirtualizingStackPanel />
    </ItemsPanelTemplate>
</DataGrid.Resources>

<DataGridComboBoxColumn Header="Chief"
                        SelectedValueBinding="{Binding ChiefReference}"
                        SelectedValuePath="Matricule"
                        Width="200">
    <DataGridComboBoxColumn.ElementStyle>
        <Style TargetType="{x:Type ComboBox}">
            <Setter Property="ItemsSource" Value="{Binding Source={StaticResource usersList}, Path=Users, IsAsync=True}"/>
            <Setter Property="ItemTemplate" Value="{StaticResource displayFullNameTemplate}"/>
            <Setter Property="ItemsPanel" Value="{StaticResource virtualizeItemsPanelTemplate}"/>
        </Style>
    </DataGridComboBoxColumn.ElementStyle>
    <DataGridComboBoxColumn.EditingElementStyle>
        <Style TargetType="{x:Type ComboBox}">
            <Setter Property="ItemsSource" Value="{Binding Source={StaticResource usersList}, Path=Users, IsAsync=True}"/>
            <Setter Property="ItemTemplate" Value="{StaticResource displayFullNameTemplate}"/>
            <Setter Property="ItemsPanel" Value="{StaticResource virtualizeItemsPanelTemplate}"/>
            <Setter Property="IsEditable" Value="True"/>
            <Setter Property="IsTextSearchEnabled" Value="True"/>
            <Setter Property="TextSearch.TextPath" Value="Name"/>
        </Style>
    </DataGridComboBoxColumn.EditingElementStyle>
</DataGridComboBoxColumn>`

我必须将所有名称显示为&#34; Name FirstName&#34;并且用户必须能够使用名称搜索组合框。 感谢Google,我设法解决了一些问题: - 施加行高和柱宽 - 异步加载以在编辑组合框或显示组合框所显示的值时显示项目。 - 我虚拟化了组合框和组合框文本块的下拉列表。 - 我启用了行和列虚拟化。

确切的问题如下:在数据网格中导航时,滚动时,如果DataGridComboBoxColumn位于视图中,则滚动变慢。然后,如果我滚动回到这个列不可见的视图,它再次流畅。然后,如果我回到此列,应用程序需要一些时间(如3秒)来显示组合框的内容。

应用程序中有大约10列和30行视图。

所以我认为问题与应用程序必须显示30个项目以及每个项目必须进行绑定这一事实有关,并应用模板按照我的要求显示信息。困扰我的是使用devexpress绝对没有性能问题。

我做错了吗?我忘记了什么吗?请帮我 :( 提前谢谢!

编辑:我将.NET更新为4.5.2版本。执行此操作后出现了另一个问题:由于我发送垃圾邮件IsAsync,我必须使用委托来填充我的静态资源(&#34;用户列表&#34;)。所以现在应用程序在开始时需要一些时间来加载这个资源(我手工创建)。但问题仍然存在。

1 个答案:

答案 0 :(得分:0)

我找到了一个不直接的解决方案。

我没有尝试改善网格性能,而是直接更改了数据库。我在项目数据库中添加了一个计算列,这是一个字符串&#34; NAME FirstName&#34;。

因此,在我的数据网格中,我没有在组合框的元素样式中显示所选值,而是显示标量值。因此,无需在展示时间在巨大的列表中搜索。

这样的事情:

<DataGridComboBoxColumn Header="Chief"
                        Width="200">
    <DataGridComboBoxColumn.ElementStyle>
        <Style TargetType="{x:Type ComboBox}">
            <Setter Property="ItemsSource" Value="{Binding ProjectCollectionView}"/>
            <Setter Property="SelectedValue" Value="{Binding ChiefReference, Mode=OneWay}"/>
            <Setter Property="SelectedValuePath" Value="ChiefReference"/>
            <Setter Property="ItemTemplate" Value="{StaticResource displayFullNameTemplateElement}"/>
            <Setter Property="ItemsPanel" Value="{StaticResource virtualizeItemsPanelTemplate}"/>
            <Setter Property="IsSynchronizedWithCurrentItem" Value="False"/>
        </Style>
    </DataGridComboBoxColumn.ElementStyle>
    <DataGridComboBoxColumn.EditingElementStyle>
        <Style TargetType="{x:Type ComboBox}">
            <Setter Property="ItemsSource" Value="{Binding usersList IsAsync=True}"/>
            <Setter Property="ItemTemplate" Value="{StaticResource displayFullNameTemplate}"/>
            <Setter Property="ItemsPanel" Value="{StaticResource virtualizeItemsPanelTemplate}"/>
            <Setter Property="IsEditable" Value="True"/>
            <Setter Property="IsTextSearchEnabled" Value="True"/>
            <Setter Property="TextSearch.TextPath" Value="Name"/>
            <Setter Property="SelectedValue" Value="{Binding ChiefReference}"/>
            <Setter Property="SelectedValuePath" Value="ChiefReferenceOfTheUserList"/>
            <Setter Property="IsSynchronizedWithCurrentItem" Value="False"/>
        </Style>
    </DataGridComboBoxColumn.EditingElementStyle>
</DataGridComboBoxColumn>

现在的问题是,由于elementstyle绑定到属性并且编辑样式绑定到另一个属性,因此组合框的selectedvalue的更改不会更改datagrid的显示值。这是因为我没有动态保存更改,用户必须按&#34; save&#34;用于保存更改的按钮。因此,只有在保存有点烦人的更改后才能看到这些更改。但这是另一个问题,现在至少表现良好。