我有一个DataGrid,它有一个CollectionViewSource绑定到它的ItemSource属性:
<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>
bookingsViewSource
定义为
<CollectionViewSource x:Key="bookingsViewSource"
d:DesignSource="{d:DesignInstance {x:Type Database:bookings}}">
<CollectionViewSource.GroupDescriptions>
<PropertyGroupDescription PropertyName="providerID"/>
</CollectionViewSource.GroupDescriptions>
</CollectionViewSource>
并填写代码背后的部分。一切都做得很好,快速而顺畅,没有分组。但是当我添加分组<PropertyGroupDescription PropertyName="providerID"/>
时,DataGrid需要大约一分钟才能加载。
在.NET 4.5中有一个名为VirtualizingPanel.IsVirtualizingWhenGrouping
的新属性,我已将其设置为true,但加载时间并未减少。
我无法弄清楚原因。有什么想法吗?
答案 0 :(得分:3)
从书中可以看出:MacDonald M. - Pro#WPF 4.5 in C#
许多因素可能会破坏用户界面虚拟化,有时甚至在您不期望它时:
- 将列表控件放在ScrollViewer中:ScrollViewer提供了一个窗口 它的孩子内容。问题是儿童内容被赋予无限的“虚拟” 空间。在这个虚拟空间中,ListBox以其全部大小呈现自己的全部大小 展出的物品。作为一个副作用,每个项目都有自己的内存占用 ListBoxItem对象。每次将ListBox放入容器时都会出现此问题 并不试图限制其规模;例如,如果出现同样的问题 将它弹出到StackPanel而不是Grid。
- 更改列表的控件模板并且无法使用ItemsPresenter: ItemsPresenter使用ItemsPanelTemplate,它指定了 VirtualizingStackPanel。如果你打破这种关系或改变了 ItemsPanelTemplate自己,所以它不使用VirtualizingStackPanel,你会输 虚拟化功能。
- 不使用数据绑定:应该是显而易见的,但如果您以编程方式填写列表 - 例如,通过动态创建ListBoxItem对象,您需要 - 否 虚拟化将会发生。当然,您可以考虑使用自己的优化 策略,例如仅创建您需要的对象并仅在其中创建它们 他们需要的时间。您将看到使用TreeView的这种技术 在第22章中创建实时节点以填充目录树。 如果您有一个大型列表,则需要避免这些做法以确保良好的性能。
此外,在我的情况下,问题是由MahApps.Metro
样式引起的。