WPF Datagrid内部具有虚拟化功能的扩展器
我正在开发的原型中存在性能问题。需求是建立一个具有多个同步冻结窗格的数据网格,支持分组和排序等。。。有关我正在构建的网格的更多详细信息,请参见 现在,我有一个关于分组的问题,特别是扩展器。我有一个由以下Xaml定义的GroupStyle,它取自WPF Datagrid内部具有虚拟化功能的扩展器,wpf,performance,xaml,wpfdatagrid,virtualization,Wpf,Performance,Xaml,Wpfdatagrid,Virtualization,我正在开发的原型中存在性能问题。需求是建立一个具有多个同步冻结窗格的数据网格,支持分组和排序等。。。有关我正在构建的网格的更多详细信息,请参见 现在,我有一个关于分组的问题,特别是扩展器。我有一个由以下Xaml定义的GroupStyle,它取自 扩展器没有虚拟化,当一个组中有几百行时,我们会遇到性能问题 以前有没有人遇到过这样的问题,并有过解决办法?我正在寻找一个理想的虚拟化扩展器,并且已经看到(这并不能解决问题) 如果您使用的是.NET 4,则根据IsExpanded状态,获取ItemsP
扩展器没有虚拟化,当一个组中有几百行时,我们会遇到性能问题
以前有没有人遇到过这样的问题,并有过解决办法?我正在寻找一个理想的虚拟化扩展器,并且已经看到(这并不能解决问题) 如果您使用的是.NET 4,则根据IsExpanded状态,获取
ItemsPresenter
s可见性以跟踪/依赖IsExpanded状态
VirtualizingPanel.isvirtualizingwengroup
另一种选择是将分组推送到ViewModel中,而不是让DataGrid/CollectionView负责。请看这里:
- 团体
- 项目
- 项目
- 项目
- 团体
- 项目
- 项目
- 项目
- 团体
- 项目
- 项目
- 项目
- 组(已折叠)
- 为了解决这个问题,我们做了以下工作
我们使用DataTemplates为不同的行视图模型提供不同的行视图。我们有一个GroupRowViewModel和ItemRowViewModel。还有一个父视图模型,它具有组/项目视图模型的排序列表
实例化网格时,父视图模型会将所有子视图模型排序为以下几类:
对不起,我不能发布任何代码(由于保密协议),但我希望这能帮助你。此外-我建议查看Telerik Grid,因为它对于大型数据集来说速度非常快这种配置的性能可能会非常慢,在连接了调试器的情况下运行调试版本,但在没有连接调试器的情况下合理地运行发布版本。你试过发布版本吗?嗨,道格,好主意,我会检查的。从我在web上的搜索结果来看,分组时WPF Datagrid似乎无法虚拟化,因为VirtualzingStackPanel包含的组很少,每个组在非虚拟化项目中都有许多行。我很遗憾,没有人能回答这个问题。无法覆盖DataGridRowsPresenter或使用其他面板吗?它能工作吗?嗨,约翰,我面前没有代码,所以不能发布完整的解决方案,但是我成功地使它工作了。它几乎涉及到对行模板的重写。所以我们有“分组”行和“项目”行。然后单击组行将从其集合视图源中删除子项行。所有这些都是在代码中完成的,速度非常快,有成千上万行。您丢失的是展开/折叠上的漂亮Swoosh动画这是一个了不起的消息,当您拥有代码时,您将能够在codeproject或其他网站上共享甚至发布它。谢谢,但我和其他许多人一样,仍然在寻找.NET 4中的解决方案=(性能很差,有1000、2000个项目被分成几个组。特别是当它打开一个扩展器时。看看这个例子……它将分组推到ViewModel中,而不是DataGrid/CollectionView中。感谢共享,在特定情况下听起来是一个很好的选择,唯一的问题是生成更大的工作…@J。).列侬科林在上面的博客文章链接与我们使用的解决方案非常相似。我当时甚至读过这篇文章。我担心这是唯一的方法
<!--Default GroupStyle-->
<GroupStyle x:Key="gs_Default">
<GroupStyle.Panel>
<ItemsPanelTemplate>
<DataGridRowsPresenter/>
</ItemsPanelTemplate>
</GroupStyle.Panel>
<GroupStyle.HeaderTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding Path=Name}" FontWeight="Bold" Padding="3"/>
</StackPanel>
</DataTemplate>
</GroupStyle.HeaderTemplate>
<GroupStyle.ContainerStyle>
<Style TargetType="{x:Type GroupItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type GroupItem}">
<Expander x:Name="exp"
BorderBrush="#FFA4B97F"
BorderThickness="0,0,0,1"
IsExpanded="{Binding Path=Items[0].IsExpanded}">
<Expander.Header>
<DockPanel TextBlock.FontWeight="Bold">
<TextBlock Text="{Binding Path=Name}" Margin="5,0,5,0" />
<TextBlock Text="{Binding Path=ItemCount}"/>
</DockPanel>
</Expander.Header>
<ItemsPresenter/>
</Expander>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</GroupStyle.ContainerStyle>
</GroupStyle>