![]() |
Prerequisite Knowledge Appearance: Group Configurations |
In addition to the built-in LevelGroupConfigurationSelector and FieldNameGroupConfigurationSelector, which can be used to select the appropriate configuration for a group based on its level or field name, custom GroupConfigurationSelectors can also be created and used.
These selectors (with or without the corresponding selector items) can be created by deriving from the GroupConfigurationSelector class and overriding the SelectGroupConfiguration method to return the appropriate configuration based on the desired criteria (see Example 1 at the bottom of the page). If a selector does not have a GroupConfiguration that corresponds to the specified information, it should either call the base implementation or return null (Nothing in VisualBasic).
When a grid is in a TableView layout, Rows located in a grid's headers, footers, fixed headers, and fixed footers (e.g., ColumnManagerRows) will query the selector in order to retrieve the GroupLevelIndicatorStyle of the appropriate GroupConfiguration. In this case, collectionViewGroup will be a null reference (Nothing in Visual Basic).
If the selector chooses GroupConfigurations based on the specified collectionViewGroup, a "dummy" GroupConfiguration that provides an identical GroupLevelIndicator style should be returned. For example, if a GroupConfiguration sets the width of its GroupLevelIndicator to 30, the "dummy" GroupConfiguration should also return 30 in its GroupLevelIndicatorStyle so that the items in the headers and footers have the same indentation as the other items to preserve Cell alignment.
It is recommended that all GroupLevelIndicatorStyles return the same width to preserve the alignment of the Cells throughout the grid.
All examples in this topic assume that the grid is bound to the Orders table of the Northwind database, unless stated otherwise.
Example 1: Creating a group-configuration selector
The following example demonstrates how to create a custom group-configuration selector that will return the appropriate group configuration depending on the number of items in a group. The implementation of the ItemCountGroupConfigurationSelector is provided below.
| XAML |
Copy Code |
|---|---|
<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="ShipCity" /> </xcdg:DataGridCollectionViewSource.GroupDescriptions> </xcdg:DataGridCollectionViewSource> </Grid.Resources> <xcdg:DataGridControl x:Name="OrdersGrid" ItemsSource="{Binding Source={StaticResource cvs_orders}}"> <xcdg:DataGridControl.GroupConfigurationSelector> <local:ItemCountGroupConfigurationSelector MinItemCount="10" /> </xcdg:DataGridControl.GroupConfigurationSelector> </xcdg:DataGridControl> </Grid> | |
| VB.NET |
Copy Code |
|---|---|
Dim collectionView As New DataGridCollectionView( Orders ) collectionView.GroupDescriptions.Add( New DataGridGroupDescription( "ShipCity" ) ) dataGridControl.GroupConfigurationSelector = New ItemCountGroupConfigurationSelector( 10 ) dataGridControl.ItemsSource = collectionView | |
| C# |
Copy Code |
|---|---|
DataGridCollectionView collectionView = new DataGridCollectionView( Orders ); collectionView.GroupDescriptions.Add( new DataGridGroupDescription( "ShipCity" ) ); dataGridControl.GroupConfigurationSelector = new ItemCountGroupConfigurationSelector( 10 ); dataGridControl.ItemsSource = collectionView; | |
The following code provides the implementation of the ItemCountGroupConfigurationSelector.
| VB.NET |
Copy Code |
|---|---|
Public Class ItemCountGroupConfigurationSelector Inherits GroupConfigurationSelector Public Sub New End Sub Public Sub New( minItemCount As Integer ) Me.MinItemCount = minItemCount End Sub Public Overrides Function SelectGroupConfiguration( ByVal groupLevel As Integer, _ ByVal collectionViewGroup As System.Windows.Data.CollectionViewGroup, _ ByVal groupDescription As System.ComponentModel.GroupDescription ) As GroupConfiguration If collectionViewGroup Is Nothing Then Return MyBase.SelectGroupConfiguration( groupLevel, collectionViewGroup, groupDescription ) End If Dim groupConfiguration As New GroupConfiguration() Dim style As New Style( GetType( Xceed.Wpf.DataGrid.DataRow ) ) If collectionViewGroup.ItemCount <= m_minItemCount Then ' red style.Setters.Add( New Setter( Xceed.Wpf.DataGrid.DataRow.BackgroundProperty, Brushes.Red ) ) Else ' green style.Setters.Add( New Setter( Xceed.Wpf.DataGrid.DataRow.BackgroundProperty, Brushes.LightGreen ) ) End If groupConfiguration.ItemContainerStyle = style Return groupConfiguration End Function Private m_minItemCount As Integer = 0 Public Property MinItemCount As Integer Get Return m_minItemCount End Get Set m_minItemCount = value End Property End Class | |
| C# |
Copy Code |
|---|---|
public class ItemCountGroupConfigurationSelector : GroupConfigurationSelector { public ItemCountGroupConfigurationSelector() { } public ItemCountGroupConfigurationSelector( int minItemCount ) :base() { this.MinItemCount = minItemCount; } public override GroupConfiguration SelectGroupConfiguration( int groupLevel, System.Windows.Data.CollectionViewGroup collectionViewGroup, System.ComponentModel.GroupDescription groupDescription ) { if( collectionViewGroup == null ) return base.SelectGroupConfiguration( groupLevel, collectionViewGroup, groupDescription ); GroupConfiguration groupConfiguration = new GroupConfiguration(); Style style = new Style( typeof( Xceed.Wpf.DataGrid.DataRow ) ); if( collectionViewGroup.ItemCount <= m_minItemCount ) // red { style.Setters.Add( new Setter( Xceed.Wpf.DataGrid.DataRow.BackgroundProperty, Brushes.Red ) ); } else // green { style.Setters.Add( new Setter( Xceed.Wpf.DataGrid.DataRow.BackgroundProperty, Brushes.LightGreen ) ); } groupConfiguration.ItemContainerStyle = style; return groupConfiguration; } private int m_minItemCount = 0; public int MinItemCount { get { return m_minItemCount; } set { if( value != m_minItemCount ) m_minItemCount = value; } } } | |