Xceed DataGrid for WPF v7.3 Documentation
In This Topic
    Custom Key/Value Mappings
    In This Topic

    The following example demonstrates how to bind the grid directly to a BindingList<Person> objects and provide a custom key/value mapping through a ForeignKeyConverter, which will return the appropriate employee first and last names for the provided employee ID.

    XAML
    Copy Code
    <Grid xmlns:xcdg="http://schemas.xceed.com/wpf/xaml/datagrid">
      <Grid.Resources>
         <local:OccupationToStringConverter x:Key="occupationToStringConverter" />
         <local:PersonForeignKeyConverter x:Key="personForeignKeyConverter" />
         <ObjectDataProvider x:Key="occupationValues"
                             MethodName="GetValues"
                             ObjectType="{x:Type sys:Enum}">
            <ObjectDataProvider.MethodParameters>
               <x:Type TypeName="local:Occupation" />
            </ObjectDataProvider.MethodParameters>
         </ObjectDataProvider>
      </Grid.Resources>    
     
      <xcdg:DataGridControl x:Name="PersonsGrid"
                            ItemsSource="{Binding Source={x:Static Application.Current}, Path=Persons}">
        <xcdg:DataGridControl.Columns>
           <xcdg:Column FieldName="Occupation">
              <xcdg:Column.CellContentTemplate>
                 <DataTemplate>
                    <TextBlock Text="{Binding Converter={StaticResource occupationToStringConverter}}" />
                 </DataTemplate>
              </xcdg:Column.CellContentTemplate>
              <xcdg:Column.ForeignKeyConfiguration>
                 <xcdg:ForeignKeyConfiguration ItemsSource="{Binding Source={StaticResource occupationValues}}" />
              </xcdg:Column.ForeignKeyConfiguration>
           </xcdg:Column>
           <xcdg:Column FieldName="ReportsTo">
              <xcdg:Column.CellContentTemplate>
                 <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                       <TextBlock Text="{Binding FirstName}" />
                       <TextBlock Text=" " />
                       <TextBlock Text="{Binding LastName}" />
                    </StackPanel>
                 </DataTemplate>
              </xcdg:Column.CellContentTemplate>
              <xcdg:Column.ForeignKeyConfiguration>
                 <xcdg:ForeignKeyConfiguration ItemsSource="{Binding Source={x:Static Application.Current}, Path=Persons}"
                                               ForeignKeyConverter="{StaticResource personForeignKeyConverter}"
                                               ValuePath="PersonID"/>
              </xcdg:Column.ForeignKeyConfiguration>
           </xcdg:Column>
        </xcdg:DataGridControl.Columns>
      </xcdg:DataGridControl>
    </Grid>

    The following code provides the implementation of the PersonForeignKeyConverter class. 

    VB.NET
    Copy Code
    Public Class PersonForeignKeyConverter
                 Inherits ForeignKeyConverter
      Public Overrides Function GetKeyFromValue( value As Object, configuration As ForeignKeyConfiguration ) As Object
        Dim bindingList As PersonBindingList = TryCast( configuration.ItemsSource, PersonBindingList )
        If Not bindingList Is Nothing Then
          Dim person As Person = TryCast( value, Person )
          If Not person Is Nothing Then
            Return person.PersonID
          End If
        End If
        Return -1
      End Function
      Public Overrides Function GetValueFromKey( key As Object, configuration As ForeignKeyConfiguration ) As Object
       Dim bindingList As PersonBindingList = TryCast( configuration.ItemsSource, PersonBindingList )
        If Not bindingList Is Nothing Then
          Try
            Dim personID As Integer = CInt( key )
            Dim person As Person
            For Each person In bindingList
              If person.PersonID = personID Then
                Return person
              End If
            Next person
          Catch e As Exception
            ' key can be nothing
          End Try
        Return Nothing
      End Function
    End Class
    C#
    Copy Code
    public class PersonForeignKeyConverter : ForeignKeyConverter
    {
     public override object GetKeyFromValue( object value, ForeignKeyConfiguration configuration )
     {
       PersonBindingList bindingList = configuration.ItemsSource as PersonBindingList;
       if( bindingList != null )
       {
         Person person = value as Person;
         if( person != null )
         {
           return person.PersonID;
         }
       }
       return -1;
     }
     public override object GetValueFromKey( object key, ForeignKeyConfiguration configuration )
     {
       PersonBindingList bindingList = configuration.ItemsSource as PersonBindingList;
       if( bindingList != null )
       {
         try
         {
           int personID = ( int )key;
           foreach( Person person in bindingList )
           {
             if( person.PersonID == personID )
             {
               return person;
             }
           }
         }
         catch( Exception )
         {
           // key can be null
         }
       }
       return null;
     }
    }

    The following code provides the implementation of the OccupationToStringConverter class.

    VB.NET
    Copy Code
    public class OccupationToStringConverter: IValueConverter
    {
      Public Function Convert( value As Object, targetType As Type, parameter As Object,
                               culture As System.Globalization.CultureInfo ) As Object Implements IValueConverter.Convert
        If( Not value Is Nothing ) AndAlso ( TypeOf value Is Occupation ) Then
          Dim enumString As String = value.ToString()
          ' Start at 1 to ignore the first capitalizes letter.
          Dim i as Integer = 1
          For i To i < enumString.Length - 1
            If char.IsUpper( enumString( i ) ) Then
              enumString = enumString.Insert( i, " " )
              i++
            End If
          Next i
          Return enumString
        End If
        Return Nothing
      End Function
      Public Function ConvertBack( value As Value, targetType As Type, parameter As Object,
                                   culture As System.Globalization.CultureInfo ) As Object Implements IValueConverter.ConvertBack
        Return Binding.DoNothing
      End Function
    End Class
    C#
    Copy Code
    public class OccupationToStringConverter: IValueConverter
    {
     public object Convert( object value, Type targetType, object parameter, System.Globalization.CultureInfo culture )
     {
       if( value != null && value is Occupation)
       {
         string enumString = value.ToString();
         // Start at 1 to ignore the first capitalizes letter.
         for( int i = 1; i < enumString.Length - 1; i++ )
         {
           if( char.IsUpper( enumString[ i ] ) )
           {
             enumString = enumString.Insert( i, " " );
             i++;
           }
         }
         return enumString;
       }
       return null;
     }
     public object ConvertBack( object value, Type targetType, object parameter, System.Globalization.CultureInfo culture )
     {
       return Binding.DoNothing;
     }
    }