WPF DataGrid:IsVirtualizingWhenGrouping =" True"不工作

时间:2015-08-19 14:02:39

标签: c# wpf datagrid ui-virtualization

我有一个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,但加载时间并未减少。

我无法弄清楚原因。有什么想法吗?

1 个答案:

答案 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样式引起的。