Grouping is supported by combining a CollectionViewSource with GroupStyle. To maintain virtualization while grouping, you must set VirtualizingPanel.IsVirtualizingWhenGrouping="True" on the host control (e.g., ListView).
Supported Orientation Combinations:
VirtualizingStackPanel.Orientation="Vertical" AND VirtualizingWrapPanel.Orientation="Horizontal": Vertical scrolling through groups, items wrap horizontally.VirtualizingStackPanel.Orientation="Horizontal" AND VirtualizingWrapPanel.Orientation="Vertical": Horizontal scrolling through groups, items wrap vertically.
Note: Any other combination is not supported.
<ListView
VirtualizingPanel.IsVirtualizingWhenGrouping="True"
ItemsSource="{Binding Source={StaticResource GroupingItemsSource}}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<vwp:VirtualizingWrapPanel/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.GroupStyle>
<GroupStyle>
<GroupStyle.Panel>
<ItemsPanelTemplate>
<VirtualizingStackPanel Orientation="Vertical"/>
</ItemsPanelTemplate>
</GroupStyle.Panel>
<GroupStyle.ContainerStyle>
<Style TargetType="{x:Type GroupItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type GroupItem}">
<StackPanel>
<ContentPresenter Name="PART_Header" />
<ItemsPresenter Name="ItemsPresenter" Margin="0" />
</StackPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</GroupStyle.ContainerStyle>
</GroupStyle>
</ItemsControl.GroupStyle>
</ListView>