WPF DataGrid的虚拟化与分组(WPF DataGrid Virtualization wi

2019-07-19 14:46发布

我使用的是从CodePlex上WPF的DataGrid ,我需要让虚拟化与分组工作。

这个问题是关于主题和指向一个MSDN实施例 ,但它仅覆盖ListControls用简单的(即,单一的“列”)的DataTemplates。

分组和虚拟化似乎是一个非常常见的情况为一个网格。 有没有一个标准/推荐/简单的获取这是怎么回事的呢?

Answer 1:

我知道我迟到了这里的聚会......但我最近就遇到了这个问题(使用内置于.NET 4 DataGrid中)。 不幸的是,仍然没有一次分组行的虚拟化在数据网格使用......但我发现了一个很漂亮的性能增强技巧,希望别人会发现有用的。

假设你使用的是ItemsPresenter您GroupItem的模板的扩展器内,默认情况下您的扩展不扩大,然后尝试简单地结合你的ItemsPresenter使用默认BooleanToVisibilityConverter扩展器的IsEnabled属性的可见性:

<BooleanToVisibilityConverter x:Key="bool2vis" />


<DataGrid.GroupStyle>
    <GroupStyle>
        <GroupStyle.ContainerStyle>
            <Style TargetType="{x:Type GroupItem}">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type GroupItem}">
                            <Expander x:Name="exp">
                                <ItemsPresenter Visibility="{Binding ElementName=exp, Path=IsExpanded, Converter={StaticResource bool2vis}}" />
                            </Expander>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </GroupStyle.ContainerStyle>
    </GroupStyle>
</DataGrid.GroupStyle>

如果你正在运行到您的DataGrid中需要很长的加载(因为它本质上是抽出你的DataGrid中,即使它是在一个倒塌的扩展每条记录)...然后使用上面的代码将导致数据网格不绘制的问题你的记录,直到你展开一个组,然后,它只会引出记录特定群组中。

不利的一面是,这不仅有利于如果你的扩展默认情况下崩溃了,还是排不明白虚拟化(如果你有在扩展组100个项目,但只有20适合在屏幕上,所有的100将在绘制时间您展开组)。

好处是,你已经基本上实现你的DataGrid记录延迟加载,这样你就不会进行绘图工作,直到你真正需要查看的项目(您选择展开组)。 对于我的产品,我的组头已经建立的按钮,其组内的所有物品进行操作,所以更多的时候,用户从来没有发展起来了,除非他们需要在一个组内的单个项目执行的操作。

*有一点要注意,如果你使用这个技巧是,你应该设定一些明确的宽度或最小宽度到您的列标题(因为项目未在DataGrid第一负载汲取的,所以列标题不能自动调整以适应大项目)。

希望真正的虚拟化被在今后的服务包来实现,但如果没有,我希望这会帮助别人!

更新

看来这个问题将在.NET 4.5有一个新的附加属性VirtualizingPanel.IsVirtualizingWhenGrouping 。



Answer 2:

有在框架4.5的新附加属性VirtualizingPanel.IsVirtualizingWhenGrouping ,它允许分组时虚拟化来进行切换。

<DataGrid EnableColumnVirtualization="True" EnableRowVirtualization="True"
   VirtualizingPanel.IsVirtualizingWhenGrouping="True">


Answer 3:

没有内置的功能,让您可以启用UI虚拟化时,在ListView或DataGrid中启用了分组,如果你想它的第二个它也是情理之中。 如何将DataGrid以不存在的项目组。 要应用分组控制需要加载整个集合至极会破坏虚拟化的全部目的。 你也许可以做的最好的是提供某种形式的虚拟化在您的视图模型(对象绑定agains)中,你只提供当前所需要的数据以及有关数据量某种通用数据的存在,然后假在看待自己。

随着分组它可以去是这样的:当分组最初启用的所有组将崩溃。 所以,你的视图模型将只需要每个组有提供一件商品。 只是为了确保该视图包含所有exisiting组。 一旦用户展开一组视图模型将动态地填充该组的项目。 这是虚拟化的一个非常简单和基本的方式,而不是最优的,但它可能是一个很好的起点。 它只是illistrate的办法。



Answer 4:

正如你所说的,使分组将禁用UI虚拟化。

我不认为你会发现一个简单的方法来解决这个问题。 我建议你检查可用的WPF DataGrid中的一个,如XCeeed一个可能有这个功能内置在他们的控制。



文章来源: WPF DataGrid Virtualization with Grouping