我是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;)。所以现在应用程序在开始时需要一些时间来加载这个资源(我手工创建)。但问题仍然存在。
答案 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;用于保存更改的按钮。因此,只有在保存有点烦人的更改后才能看到这些更改。但这是另一个问题,现在至少表现良好。