我使用的是从CodePlex上WPF的DataGrid ,我需要让虚拟化与分组工作。
这个问题是关于主题和指向一个MSDN实施例 ,但它仅覆盖ListControls用简单的(即,单一的“列”)的DataTemplates。
分组和虚拟化似乎是一个非常常见的情况为一个网格。 有没有一个标准/推荐/简单的获取这是怎么回事的呢?
我使用的是从CodePlex上WPF的DataGrid ,我需要让虚拟化与分组工作。
这个问题是关于主题和指向一个MSDN实施例 ,但它仅覆盖ListControls用简单的(即,单一的“列”)的DataTemplates。
分组和虚拟化似乎是一个非常常见的情况为一个网格。 有没有一个标准/推荐/简单的获取这是怎么回事的呢?
我知道我迟到了这里的聚会......但我最近就遇到了这个问题(使用内置于.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 。
有在框架4.5的新附加属性VirtualizingPanel.IsVirtualizingWhenGrouping ,它允许分组时虚拟化来进行切换。
<DataGrid EnableColumnVirtualization="True" EnableRowVirtualization="True"
VirtualizingPanel.IsVirtualizingWhenGrouping="True">
没有内置的功能,让您可以启用UI虚拟化时,在ListView或DataGrid中启用了分组,如果你想它的第二个它也是情理之中。 如何将DataGrid以不存在的项目组。 要应用分组控制需要加载整个集合至极会破坏虚拟化的全部目的。 你也许可以做的最好的是提供某种形式的虚拟化在您的视图模型(对象绑定agains)中,你只提供当前所需要的数据以及有关数据量某种通用数据的存在,然后假在看待自己。
随着分组它可以去是这样的:当分组最初启用的所有组将崩溃。 所以,你的视图模型将只需要每个组有提供一件商品。 只是为了确保该视图包含所有exisiting组。 一旦用户展开一组视图模型将动态地填充该组的项目。 这是虚拟化的一个非常简单和基本的方式,而不是最优的,但它可能是一个很好的起点。 它只是illistrate的办法。
正如你所说的,使分组将禁用UI虚拟化。
我不认为你会发现一个简单的方法来解决这个问题。 我建议你检查可用的WPF DataGrid中的一个,如XCeeed一个可能有这个功能内置在他们的控制。