Xceed DataGrid for WPF v7.2 Documentation
StatResultConverter Class
Members  Example 


Xceed.Wpf.DataGrid Assembly > Xceed.Wpf.DataGrid.Converters Namespace : StatResultConverter Class
Represents a converter that can be used to format the result of a statistical function, as well as display a user-friendly message when an exception occurs within the function during the calculation of its result.
Syntax
'Declaration
 
<ValueConversionAttribute(System.Object, System.String)>
Public Class StatResultConverter 
   Inherits StringFormatConverter
'Usage
 
Dim instance As StatResultConverter
[ValueConversion(System.Object, System.String)]
public class StatResultConverter : StringFormatConverter 
Remarks

The messages returned by a StatResultConverter when an exception occurs during the calculation of a statistical function's result depend on the type of the exception that was thrown. The following table provides a list of exceptions for which default messages have been provided: 

Exception Default message
DivideByZeroException #DIV/0#
Exception #[Exception.Message]#
InvalidSourcePropertyNameException #[InvalidSourcePropertyNameException.SourcePropertyName]#
InvalidValueException #VALUE#
OverflowException #OVER#

Composite format strings use braces ("{}") to identify place-holders, which causes an issue when providing a format string to a StatResultConverter in XAML; therefore, the StatResultConverter supports square brackets ("[]") as a substitute for braces. For example, if normally {0:#0.0} would have been used, it would be replaced with [#0.0] when using a StatResultConverter. If braces are preferred, the format string must be preceded with a closing brace (e.g., ConverterParameter={}{0:#0.0}}).

When using square brackets, the 0: that represents the place-holder must be omitted otherwise an exception will be thrown.
Example
All examples in this topic assume that the grid is bound to the Orders or Employees tables of the Northwind database, unless stated otherwise.
The following example demonstrates how to display the results of various statistical functions in and outside of a grid.The following example demonstrates how to change the statistical context of a TextBlock that displays the results of a statistical function when the current item is changed. The statistical context of the TextBlock will be changed in the grid's PropertyChanged event handler by using the GetParentGroupFromItem method to retrieve the current group and set it as the new statistical context. To simplify the code below, the DataContext of the StackPanel could have been modified rather than the DataContext of each TextBlock. The implementation of the PropertyChanged event handler is located below.The following code provides the implementation of the PropertyChanged event handler.The following code provides the implementation of the PropertyChanged event handler.The following example demonstrates how to create a custom data template that will be used in the footers of the first-level groups to display the results of various statistical functions.The following example demonstrates how to explicitly define detail descriptions for the DataRelations found in the DataTable to which the grid is bound and how to calculate statistical functions for a detail description whose results will be displayed in the StatRows contained in the footer sections of the details to which the description's corresponding detail configuration will be applied.
<Grid xmlns:xcdg="http://schemas.xceed.com/wpf/xaml/datagrid">
  <Grid.Resources>
    <xcdg:DataGridCollectionViewSource x:Key="cvs_orderdetails"
                                       Source="{Binding Source={x:Static Application.Current},
                                                        Path=OrderDetails}">
     <xcdg:DataGridCollectionViewSource.StatFunctions>
       <xcdg:CountFunction ResultPropertyName="orderid_count"
                           SourcePropertyName="OrderID"/>
       <xcdg:SumFunction ResultPropertyName="unitprice_sum"
                         SourcePropertyName="UnitPrice"/>
       <xcdg:AverageFunction ResultPropertyName="unitprice_average"
                             SourcePropertyName="UnitPrice"/>
       <xcdg:SumFunction ResultPropertyName="quantity_sum" SourcePropertyName="Quantity"/>
     </xcdg:DataGridCollectionViewSource.StatFunctions>
     <xcdg:DataGridCollectionViewSource.GroupDescriptions>
       <xcdg:DataGridGroupDescription PropertyName="ProductID"/>      
 </xcdg:DataGridCollectionViewSource.GroupDescriptions>
    </xcdg:DataGridCollectionViewSource>
   <xcdg:StatResultConverter x:Key="valueConverter"/>
  </Grid.Resources>
  <DockPanel>
    <StackPanel Orientation="Horizontal" DockPanel.Dock="Top">
      <TextBlock Text="Total Orders: "/>
      <TextBlock Text="{Binding ElementName=OrderDetailsGrid,
                 Path=StatContext.orderid_count}"/>
    </StackPanel>
     <StackPanel Orientation="Horizontal" DockPanel.Dock="Top">
       <TextBlock Text="Average Unit Price: "/>
     <TextBlock Text="{Binding ElementName=OrderDetailsGrid,
                        Path=StatContext.unitprice_average,
                        Converter={StaticResource valueConverter},
                        ConverterParameter=f2}"/>
    </StackPanel>
    <xcdg:DataGridControl x:Name="OrderDetailsGrid"
                          ItemsSource="{Binding Source={StaticResource cvs_orderdetails}}"
                          DockPanel.Dock="Bottom">
      <xcdg:DataGridControl.DefaultGroupConfiguration>
        <xcdg:GroupConfiguration> 
        <xcdg:GroupConfiguration.Footers>
           <DataTemplate>
               <xcdg:StatRow>
               <xcdg:StatCell FieldName="UnitPrice"
                                   ResultPropertyName="unitprice_sum"/>
               <xcdg:StatCell FieldName="Quantity" ResultPropertyName="quantity_sum"/>
               <xcdg:StatCell FieldName="OrderID" ResultPropertyName="orderid_count"/>
               <xcdg:StatCell FieldName="UnitPrice"
                              ResultPropertyName="unitprice_average"
                              ResultConverterParameter="f2"/>
             </xcdg:StatRow>
           </DataTemplate>
         </xcdg:GroupConfiguration.Footers>
        </xcdg:GroupConfiguration>
      </xcdg:DataGridControl.DefaultGroupConfiguration>    
    </xcdg:DataGridControl>
  </DockPanel>
</Grid>
<Grid xmlns:xcdg="http://schemas.xceed.com/wpf/xaml/datagrid">
  <Grid.Resources>
    <xcdg:DataGridCollectionViewSource x:Key="cvs_orderdetails"
                                    Source="{Binding Source={x:Static Application.Current}, 
                                                     Path=OrderDetails}">

      <xcdg:DataGridCollectionViewSource.StatFunctions>
        <xcdg:CountFunction ResultPropertyName="orderid_count"
                            SourcePropertyName="OrderID"/>
        <xcdg:AverageFunction ResultPropertyName="unitprice_average"
                              SourcePropertyName="UnitPrice"/>              
      </xcdg:DataGridCollectionViewSource.StatFunctions>
      <xcdg:DataGridCollectionViewSource.GroupDescriptions>
        <xcdg:DataGridGroupDescription PropertyName="ProductID"/>
      </xcdg:DataGridCollectionViewSource.GroupDescriptions>
    </xcdg:DataGridCollectionViewSource>
    <xcdg:StatResultConverter x:Key="valueConverter"/>
  </Grid.Resources>
  <DockPanel>
    <StackPanel Orientation="Horizontal" DockPanel.Dock="Top">
      <TextBlock Text="Results for product "/>
      <TextBlock x:Name="CurrentGroupTitle" Text="{Binding Name}"/>
      <TextBlock Text=": "/>
      <TextBlock Text="     Total Orders-"/>
      <TextBlock x:Name="TotalOrders" Text="{Binding orderid_count}"/>
      <TextBlock Text="     Average Unit Price-"/>
      <TextBlock x:Name="AveragePrice"
                 Text="{Binding unitprice_average,
                        Converter={StaticResource valueConverter},
                        ConverterParameter=f2}"/>
    </StackPanel>
    <xcdg:DataGridControl x:Name="OrderDetailsGrid"
                          ItemsSource="{Binding Source={StaticResource cvs_orderdetails}}"
                          PropertyChanged="CurrentItemChanged"
                          DockPanel.Dock="Bottom"/>
  </DockPanel>
</Grid>
Private Sub CurrentItemChanged( ByVal sender As Object, _
                                ByVal e AsPropertyChangedEventArgs  )
  If e.PropertyName = "CurrentItem" Then

    If Me.OrderDetailsGrid.CurrentItem Is Nothing Then
      Return

    Dim group As CollectionViewGroup =
              Me.OrderDetailsGrid.GetParentGroupFromItem( Me.OrderDetailsGrid.CurrentItem )

    Me.CurrentGroupTitle.DataContext = group
    Me.TotalOrders.DataContext = group
    Me.AveragePrice.DataContext = group
  End If
End Sub
private void CurrentItemChanged( object sender, PropertyChangedEventArgs e )
{
  if( e.PropertyName == "CurrentItem" )
  {

    if( this.OrderDetailsGrid.CurrentItem == null )
      return;

    CollectionViewGroup group =
              this.OrderDetailsGrid.GetParentGroupFromItem( this.OrderDetailsGrid.CurrentItem );

    this.CurrentGroupTitle.DataContext = group;
    this.TotalOrders.DataContext = group;
    this.AveragePrice.DataContext = group;
  }
}
<Grid xmlns:xcdg="http://schemas.xceed.com/wpf/xaml/datagrid">
  <Grid.Resources>
    <xcdg:DataGridCollectionViewSource x:Key="cvs_orderdetails"
                                       Source="{Binding Source={x:Static Application.Current},
                                                        Path=OrderDetails}"> 
    <xcdg:DataGridCollectionViewSource.StatFunctions>
       <xcdg:CountFunction ResultPropertyName="orderid_count"
                           SourcePropertyName="OrderID"/>
       <xcdg:SumFunction ResultPropertyName="unitprice_sum"
                         SourcePropertyName="UnitPrice"/>
       <xcdg:AverageFunction ResultPropertyName="unitprice_average"
                             SourcePropertyName="UnitPrice"/>
       <xcdg:SumFunction ResultPropertyName="quantity_sum"
                         SourcePropertyName="Quantity"/>
     </xcdg:DataGridCollectionViewSource.StatFunctions>       
      <xcdg:DataGridCollectionViewSource.GroupDescriptions>
        <xcdg:DataGridGroupDescription PropertyName="ProductID"/>
      </xcdg:DataGridCollectionViewSource.GroupDescriptions>
    </xcdg:DataGridCollectionViewSource>
   <xcdg:StatResultConverter x:Key="valueConverter"/>
  </Grid.Resources>
  <xcdg:DataGridControl x:Name="OrderDetailsGrid"
                        ItemsSource="{Binding Source={StaticResource cvs_orderdetails}}">
    <xcdg:DataGridControl.DefaultGroupConfiguration>
      <xcdg:GroupConfiguration>
        <xcdg:GroupConfiguration.Footers>
          <xcdg:GroupHeaderFooterItemTemplate VisibleWhenCollapsed="True">
            <DataTemplate>
              <Border Background="#999999"
                      BorderBrush="LightBlue"
                      BorderThickness="3"
                      Margin="5" >
                <Grid>
                  <Grid.ColumnDefinitions>
                    <ColumnDefinition/>
                    <ColumnDefinition/>
                  </Grid.ColumnDefinitions>
                  <Grid.RowDefinitions>
                    <RowDefinition/>
                    <RowDefinition/>
                    <RowDefinition/>
                    <RowDefinition/>
                  </Grid.RowDefinitions>
                  <TextBlock Text="Total Orders: " Grid.Row="0" Grid.Column="0"/>
                   <TextBlock Text="{Binding RelativeSource={RelativeSource Self},
                                             Path=(xcdg:DataGridControl.StatContext).orderid_count}"
                              Grid.Row="0" Grid.Column="1"/>                    
                    <TextBlock Text="Total Quantity Sold: " Grid.Row="1" Grid.Column="0"/>
                   <TextBlock Text="{Binding RelativeSource={RelativeSource Self},
                                   Path=(xcdg:DataGridControl.StatContext).quantity_sum}"
                                   Grid.Row="1" Grid.Column="1"/>  
                    <TextBlock Text="Total Sales: " Grid.Row="2" Grid.Column="0"/>
                   <TextBlock Text="{Binding RelativeSource={RelativeSource Self},
                                             Path=(xcdg:DataGridControl.StatContext).unitprice_sum}"
                              Grid.Row="2" Grid.Column="1"/>  
                    <TextBlock Text="Average Unit Price: " Grid.Row="3" Grid.Column="0"/>
                   <TextBlock Text="{Binding RelativeSource={RelativeSource Self},
                                             Path=(xcdg:DataGridControl.StatContext).unitprice_average,
                                             Converter={StaticResource valueConverter},
                                             ConverterParameter=f2}"
                              Grid.Row="3" Grid.Column="1"/>         
                  </Grid>
                </Border> 
              </DataTemplate>  
            </xcdg:GroupHeaderFooterItemTemplate>
          </xcdg:GroupConfiguration.Footers>
        </xcdg:GroupConfiguration>
      </xcdg:DataGridControl.DefaultGroupConfiguration>
      <xcdg:DataGridControl.View>
        <xcdg:CardView AllowCardResize="True"/>
      </xcdg:DataGridControl.View>
    </xcdg:DataGridControl>
  </Grid>
<Grid>
  <Grid.Resources>
     <xcdg:DataGridCollectionViewSource x:Key="cvs_employees"
                                        Source="{Binding Source={x:Static Application.Current}, 
                                                         Path=Employees}">

       <xcdg:DataGridCollectionViewSource.DetailDescriptions>
          <xcdg:DataRelationDetailDescription RelationName="Employee_Orders"
                                              Title="Employee Orders">
             <xcdg:DataRelationDetailDescription.DetailDescriptions>
                <xcdg:DataRelationDetailDescription RelationName="Order_OrderDetails"
                                                    Title="Order Details">
                   <xcdg:DataRelationDetailDescription.ItemProperties>
                      <xcdg:DataGridItemProperty Name="UnitPrice" />
                      <xcdg:DataGridItemProperty Name="Quantity" />
                      <xcdg:DataGridItemProperty Name="Discount" />
                   </xcdg:DataRelationDetailDescription.ItemProperties>
                   <xcdg:DataRelationDetailDescription.StatFunctions>                          
                      <xcdg:SumFunction ResultPropertyName="sum_quantity"
                                        SourcePropertyName="Quantity" />
                      <xcdg:AverageFunction ResultPropertyName="average_unitprice"
                                            SourcePropertyName="UnitPrice" />
                   </xcdg:DataRelationDetailDescription.StatFunctions>
                </xcdg:DataRelationDetailDescription>
             </xcdg:DataRelationDetailDescription.DetailDescriptions>
          </xcdg:DataRelationDetailDescription>
       </xcdg:DataGridCollectionViewSource.DetailDescriptions>
     </xcdg:DataGridCollectionViewSource>
  </Grid.Resources>
 
  <xcdg:DataGridControl x:Name="EmployeesGrid"
                      ItemsSource="{Binding Source={StaticResource cvs_employees}}"
                      ItemsSourceName="Employee Information"
                      AutoCreateDetailConfigurations="True">

    <xcdg:DataGridControl.DetailConfigurations>
       <xcdg:DetailConfiguration RelationName="Employee_Orders">
          <xcdg:DetailConfiguration.DetailConfigurations>
             <xcdg:DetailConfiguration RelationName="Order_OrderDetails">
                <xcdg:DetailConfiguration.Footers>
                   <DataTemplate>
                      <xcdg:StatRow Background="AliceBlue">
                         <xcdg:StatCell FieldName="UnitPrice"
                                        ResultPropertyName="average_unitprice"
                                        ResultConverterParameter="f2" />
                         <xcdg:StatCell FieldName="Quantity"
                                        ResultPropertyName="sum_quantity" />                             
                      </xcdg:StatRow>
                   </DataTemplate>
                </xcdg:DetailConfiguration.Footers>
             </xcdg:DetailConfiguration>
          </xcdg:DetailConfiguration.DetailConfigurations>
       </xcdg:DetailConfiguration>
     </xcdg:DataGridControl.DetailConfigurations>  
   </xcdg:DataGridControl>
</Grid>
Inheritance Hierarchy

System.Object
   Xceed.Wpf.DataGrid.Converters.StringFormatConverter
      Xceed.Wpf.DataGrid.Converters.StatResultConverter

Requirements

Target Platforms: Windows 11, Windows 10, Windows 7, Windows Vista SP1 or later, Windows XP SP3, Windows Server 2008 (Server Core not supported), Windows Server 2008 R2 (Server Core supported with SP1 or later), Windows Server 2003 SP2

See Also

Reference

StatResultConverter Members
Xceed.Wpf.DataGrid.Converters Namespace