I had a view model that consisted of a linked list of nodes. I wanted to group one set of nodes so I decided to try out the grouping functionality of CollectionViewSource.
Here's my XAML:
<HierarchicalDataTemplate x:Key="ActionNodeTemplate">
<tool:ActionNavigatorActionNodeUC />
</HierarchicalDataTemplate>
<HierarchicalDataTemplate x:Key="GroupTemplate" ItemsSource="{Binding Items}" ItemTemplate="{StaticResource ActionNodeTemplate}">
<Label Foreground="Green" Content="{Binding Path=Name}" Name="NodeLabel"/>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="{x:Type an:ActionProjectSummaryNode}" ItemsSource="{Binding SubItemsView.View.Groups}" ItemTemplate="{StaticResource GroupTemplate}">
<Label Foreground="Red" Content="{Binding Path=DisplayText}" Name="NodeLabel"/>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="{x:Type an:RootActionNavigatorNode}" ItemsSource="{Binding SubItems}">
<Label Foreground="Blue" Content="{Binding Path=DisplayText}" Name="NodeLabel"/>
</HierarchicalDataTemplate>
ProjectActionSummaryNode exposed a CollectionViewSource of ActionNode items named SubItemsView. In that node i grouped by the Data.ActionTypeDescription with:
SubItemsView.GroupDescriptions.Clear();
SubItemsView.GroupDescriptions.Add(new PropertyGroupDescription("Data.ActionTypeDescription"));
That was pretty much it. For nodes of type ActionProjectSummaryNode, ItemsSource was set to SubItemsView.View.Groups. Groups is a ReadOnlyObervableCollection of CollectionViewGroup objects (CollectionViewGroupInternal actually). Each one has a Name property that represents the Group (in this case Data.ActionTypeDescription), and a Items Property that contains the original items that were grouped (ActionNodes).