C# WPF DataGrid:isVirtualizangWhenGrouping=";“真的”;不起作用
我有一个DataGrid,它的CollectionViewSource绑定到它的ItemSource属性:C# WPF DataGrid:isVirtualizangWhenGrouping=";“真的”;不起作用,c#,wpf,datagrid,ui-virtualization,C#,Wpf,Datagrid,Ui Virtualization,我有一个DataGrid,它的CollectionViewSource绑定到它的ItemSource属性: <DataGrid Grid.Row="0" RowBackground="#10808080" AlternatingRowBackground="Transparent" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" ItemsSource="{Binding Sourc
<DataGrid Grid.Row="0" RowBackground="#10808080" AlternatingRowBackground="Transparent"
HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
ItemsSource="{Binding Source={StaticResource bookingsViewSource}}"
RowHeight="27"
VirtualizingPanel.IsVirtualizingWhenGrouping="True"
VirtualizingPanel.IsContainerVirtualizable="True"
VirtualizingPanel.ScrollUnit="Item"
AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding date, StringFormat=dd.MM.yyyy}" Header="date"/>
<DataGridTextColumn Binding="{Binding Path=customers.name}" Header="customer"/>
<DataGridTextColumn Binding="{Binding Path=customers.street}" Header="adress"/>
</DataGrid.Columns>
<DataGrid.GroupStyle>
<GroupStyle>
<GroupStyle.ContainerStyle>
<Style TargetType="{x:Type GroupItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<Expander Header="{Binding Path=Name}" IsExpanded="True">
<ItemsPresenter />
</Expander>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</GroupStyle.ContainerStyle>
</GroupStyle>
</DataGrid.GroupStyle>
</DataGrid>
在代码隐藏部分填写。没有分组,一切都进行得很顺利。但是当我添加分组
时,DataGrid大约需要一分钟来加载
在.NET 4.5中,有一个新属性名为VirtualizingPanel.isvirtualizingwengroup
,我已经将其设置为true,但加载时间没有减少
我不明白为什么。有什么想法吗?来自《MacDonald M.-Pro WPF 4.5 C版》一书# 有许多因素可能会破坏UI虚拟化,有时是在您意想不到的情况下:
- 将列表控件放在ScrollViewer中:ScrollViewer在 它的子内容。问题是子内容被赋予无限的“虚拟” 空间在这个虚拟空间中,ListBox以完整的大小呈现自己,并显示其所有子对象 展出的物品。作为副作用,每个项目都会占用自己的内存 ListBoxItem对象。当您在容器中放置列表框时,就会出现此问题 这并不试图限制它的大小;例如,如果 将其弹出到StackPanel而不是网格中
- 更改列表的控件模板并未能使用ItemsPresenter: ItemsPresenter使用ItemsPanelTemplate,它指定 虚拟化跟踪面板。如果你打破了这种关系或者你改变了 ItemsPanelTemplate你自己,这样它就不会使用虚拟化StackPanel,你会输的 虚拟化功能
- 不使用数据绑定:这应该是显而易见的,但如果以编程方式填充列表- 例如,通过动态创建ListBoxItem对象,您不需要 虚拟化将会发生。当然,你可以考虑使用你自己的优化。 策略,例如只创建您需要的对象,并且只在 他们需要的时间。您将通过使用 创建即时节点以填充第22章中的目录树。 如果您有一个很大的列表,您需要避免这些做法以确保良好的性能
另外,在我的案例中,问题是由
MahApps.Metro
样式引起的。在启用分组后,也经历了难以置信的减速,并且恰好使用MahApps Metro进行样式设置。事实上,性能损失是如此严重,以至于当您尝试扩展组时,应用程序就无法使用。幸运的是,我无意中发现了这篇文章,它指出网格的风格是一个可能的原因,事实确实如此。如果希望保持MahApps样式,只需在datagrid上设置一个属性即可解决性能问题。ScrollViewer.CanContentScroll=“True”第二个选项,即使您将VirtualzingStackPanel作为ItemsPanelTemplate,它也会减慢速度。。。
<CollectionViewSource x:Key="bookingsViewSource"
d:DesignSource="{d:DesignInstance {x:Type Database:bookings}}">
<CollectionViewSource.GroupDescriptions>
<PropertyGroupDescription PropertyName="providerID"/>
</CollectionViewSource.GroupDescriptions>
</CollectionViewSource>