【问题标题】:WPF DataGrid: IsVirtualizingWhenGrouping="True" not workingWPF DataGrid:IsVirtualizingWhenGrouping="True" 不起作用
【发布时间】:2015-08-19 14:02:39
【问题描述】:

我有一个 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>

并在后面的部分中填写代码。在没有分组的情况下,一切都做得很好。但是当我添加分组&lt;PropertyGroupDescription PropertyName="providerID"/&gt; 时,DataGrid 需要大约一分钟才能加载。

在 .NET 4.5 中有一个名为 VirtualizingPanel.IsVirtualizingWhenGrouping 的新属性,我已将其设置为 true,但加载时间并未减少。

我不知道为什么。有什么想法吗?

【问题讨论】:

    标签: c# wpf datagrid ui-virtualization


    【解决方案1】:

    摘自本书:MacDonald M. - C# 中的 Pro WPF 4.5

    许多因素可能会破坏 UI 虚拟化,有时是您意想不到的:

    • 将列表控件放入 ScrollViewer:ScrollViewer 提供了一个窗口 它的子内容。问题是子内容被赋予了无限的“虚拟” 空间。在这个虚拟空间中,ListBox 以全尺寸呈现自己,以及它的所有子项 展出的物品。作为副作用,每个项目都有自己的内存占用 ListBoxItem 对象。每当您将 ListBox 放在容器中时,都会出现此问题 不会试图限制其大小;例如,如果出现同样的问题 您将其弹出到 StackPanel 而不是 Grid 中。
    • 更改列表的控件模板并且无法使用 ItemsPresenter: ItemsPresenter 使用 ItemsPanelTemplate,它指定 虚拟化堆栈面板。如果你打破这种关系,或者如果你改变 ItemsPanelTemplate 你自己,所以它不使用 VirtualizingStackPanel,你会输 虚拟化功能。
    • 不使用数据绑定:这应该很明显,但如果您以编程方式填写列表— 例如,通过动态创建您需要的 ListBoxItem 对象——不 会出现虚拟化。当然也可以考虑使用自己的优化 策略,例如只创建您需要的那些对象,并且只在 他们需要的时间。你会看到这个技术在 TreeView 的作用下使用 即时节点创建以填充第 22 章中的目录树。 如果您的列表很大,则需要避免这些做法以确保良好的性能。

    另外,就我而言,问题是由MahApps.Metro 样式引起的。

    【讨论】:

    • 一旦启用分组并且碰巧使用 MahApps Metro 进行样式设置,也会经历令人难以置信的减速。事实上,性能损失是如此严重,以至于一旦您尝试扩展组,应用程序就无法使用。幸运的是,我偶然发现了这篇文章,它指出网格的风格是一个可能的原因,确实是这样。如果您希望保留 MahApps 样式,只需在数据网格上设置一个属性即可解决性能问题。 ScrollViewer.CanContentScroll="True"
    • 第二个,即使你有 VirtualizingStackPanel 作为你的 ItemsPanelTemplate,它也会变慢...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多