Selecting all Data Items in a Group
The following example demonstrates how to select all the data items contained in a group by adding them to a grid's selected-items collection when a group-header control is pressed. In the case where a group contains child groups, all the data items in the child groups will also be selected.
note
In v5.3 and up, this functionality can be activated by setting the IsGroupSelectionEnabled property to true.
- XAML
- C#
- VB.NET
<Grid xmlns:xcdg="http://schemas.xceed.com/wpf/xaml/datagrid">
<Grid.Resources>
<xcdg:DataGridCollectionViewSource x:Key="cvs_orders"
Source="{Binding Source={x:Static Application.Current},
Path=Orders}">
<xcdg:DataGridCollectionViewSource.GroupDescriptions>
<xcdg:DataGridGroupDescription PropertyName="ShipCountry"/>
<xcdg:DataGridGroupDescription PropertyName="ShipCity"/>
</xcdg:DataGridCollectionViewSource.GroupDescriptions>
</xcdg:DataGridCollectionViewSource>
<Style TargetType="{x:Type xcdg:GroupHeaderControl}">
<EventSetter Event="PreviewMouseLeftButtonDown"
Handler="SelectRows"/>
</Style>
</Grid.Resources>
<xcdg:DataGridControl x:Name="OrdersGrid"
ItemsSource="{Binding Source={StaticResource cvs_orders}}"/>
</Grid>
private void SelectRows( object sender, MouseEventArgs e )
{
GroupHeaderControl groupHeaderControl = sender as GroupHeaderControl;
if( groupHeaderControl == null )
return;
DataGridContext context = DataGridControl.GetDataGridContext( groupHeaderControl );
GroupHeaderFooterItem header = ( GroupHeaderFooterItem )context.GetItemFromContainer( groupHeaderControl );
if( !header.Equals( GroupHeaderFooterItem.Empty ) )
{
CollectionViewGroup group = context.GetParentGroupFromItem( header );
if( group != null )
{
foreach( object item in group.Items )
{
if( item is CollectionViewGroup )
{
this.SelectRecurse( context, ( CollectionViewGroup )item );
}
else
{
context.SelectedItems.Add( item );
}
}
}
}
}
private void SelectRecurse( DataGridContext context, CollectionViewGroup group )
{
foreach( object item in group.Items )
{
if( item is CollectionViewGroup )
{
this.SelectRecurse( context, ( CollectionViewGroup )item );
}
else
{
context.SelectedItems.Add( item );
}
}
}
Private Sub SelectRows( ByVal sender As Object, ByVal e As MouseButtonEventArgs )
Dim groupHeaderControl As GroupHeaderControl = TryCast( sender, GroupHeaderControl );
If groupHeaderControl Is Nothing Then
Return;
End If
Dim context As DataGridContext = DataGridControl.GetDataGridContext( groupHeaderControl )
Dim header As GroupHeaderFooterItem = TryCast( context.GetItemFromContainer( grouHeaderControl, GroupHeaderFooterItem )
If Not header.Equals( GroupHeaderFooterItem.Empty ) Then
Dim group As CollectionViewGroup = context.GetParentGroupFromItem( header )
If Not group Is Nothing Then
For Each item As Object In group.Items
If TypeOf item Is CollectionViewGroup Then
Me.SelectRecurse( context, CType( item, CollectionViewGroup ) )
Else
context.SelectedItems.Add( item )
End If
Next item
End If
End If
End Sub
Private Sub SelectRecurse( ByVal context As DataGridContext, ByVal group As CollectionViewGroup )
For Each item As Object In group.Items
If TypeOf item Is CollectionViewGroup Then
Me.SelectRecurse( context, CType( item, CollectionViewGroup ) )
Else
context.SelectedItems.Add( item )
End If
Next item
End Sub