Xceed Toolkit Plus for WPF v4.6 Documentation
Binding to an IQueryable data source

The following example demonstrates how to bind to a data source that implements IQueryable (LINQ DataContext) and allow items to be edited, deleted, inserted, and refreshed.

XAML
Copy Code
<Grid xmlns:xcdg="http://schemas.xceed.com/wpf/xaml/datagrid">
   <Grid.Resources>
     <xcdg:DataGridVirtualizingQueryableCollectionViewSource x:Key="cvs_queryableSource"
                                                             QueryableSource="{Binding Path=QueryableSource}"
                                                             CommitMode="EditCommitted"
                                                             CreatingNewItem="DataGridVirtualizingQueryableCollectionViewSource_CreatingNewItem"
                                                             CommittingNewItem="DataGridVirtualizingQueryableCollectionViewSource_CommittingNewItem"
                                                             CancelingNewItem="DataGridVirtualizingQueryableCollectionViewSource_CancelingNewItem"
                                                             CommitItems="DataGridVirtualizingQueryableCollectionViewSource_CommitItems"
                                                             RemovingItem="DataGridVirtualizingQueryableCollectionViewSource_RemovingItem" />
   </Grid.Resources>
   <xcdg:DataGridControl ItemsSource="{Binding Source={StaticResource cvs_queryableSource}}"
                         ItemScrollingBehavior="Deferred"
                         MaxGroupLevels="2"
                         MaxSortLevels="2"
                         IsDeleteCommandEnabled="True"
                         IsRefreshCommandEnabled="True">
      <xcdg:DataGridControl.Resources>
         <Style TargetType="{x:Type xcdg:Row}"
                x:Key="RowHeightStyle">
            <Setter Property="Height"
                    Value="27" />
         </Style>
         <Style TargetType="{x:Type xcdg:DataRow}"
                BasedOn="{StaticResource RowHeightStyle}" />
         <Style TargetType="{x:Type xcdg:InsertionRow}"
                BasedOn="{StaticResource RowHeightStyle}" />
      </xcdg:DataGridControl.Resources>
      <xcdg:DataGridControl.View>
         <xcdg:TableView>
            <xcdg:TableView.FixedHeaders>
               <DataTemplate>
                  <xcdg:InsertionRow />
               </DataTemplate>
            </xcdg:TableView.FixedHeaders>
         </xcdg:TableView>
      </xcdg:DataGridControl.View>
      <xcdg:DataGridControl.Columns>
         <xcdg:Column FieldName="ProductID"
                      AllowSort="False"
                      AllowGroup="False" />
      </xcdg:DataGridControl.Columns>
   </xcdg:DataGridControl>
</Grid>

The following code provides the code-behind implementation of the CommitMode, CreatingNewItem, CommittingNewItem, CancelingNewItem, CommitItems, and RemovingItem events. 

VB.NET
Copy Code
Public Partial Class Window1
                     Inherits Window
  Public Sub New
    Me.DataContext = Me
    InitializeComponent()
  End Sub
  ' QUERYABLE SOURCE
  Public ReadOnly Property QueryableSource As IQueryable
    Get
      If m_queryable Is Nothing Then
        m_northwind = New NorthwindDataContext()
        m_queryable = m_northwind.Products
      End If
      Return m_queryable
    End Get
  End Property
  Private m_northwind As NorthwindDataContext
  Private m_queryable As IQueryable
  ' QUERYABLE INSERTION SUPPORT
  Private Sub DataGridVirtualizingQueryableCollectionViewSource_CreatingNewItem( sender As Object, e As DataGridCreatingNewItemEventArgs )
    Dim productToInsert As New Product()
    e.NewItem = productToInsert
    m_northwind.Products.InsertOnSubmit( productToInsert )
    e.Handled = True
  End Sub
  Private Sub DataGridVirtualizingQueryableCollectionViewSource_CommittingNewItem( sender As Object, e As DataGridCommittingNewItemEventArgs )
    Try
      m_northwind.SubmitChanges()
    Catch e As Exception
      e.Cancel = True
    End try
    e.Handled = True
  End Sub
  Private Sub DataGridVirtualizingQueryableCollectionViewSource_CancelingNewItem( sender As Object, e As DataGridItemHandledEventArgs )
    m_northwind.GetChangeSet().Inserts.Clear()
    e.Handled = True
  End Sub
  ' QUERYABLE EDIT SUPPORT
  Private Sub DataGridVirtualizingQueryableCollectionViewSource_CommitItems( sender As Object, e As CommitItemsEventArgs )
    Try
      m_northwind.SubmitChanges()
    Catch e As Exception
      m_northwind.GetChangeSet().Updates.Clear()
    Finally
      e.AsyncCommitInfo.EndCommit()
    End Try
  End Sub
  ' QUERYABLE DELETE SUPPORT
  Private Sub DataGridVirtualizingQueryableCollectionViewSource_RemovingItem( sender As Object, e as DataGridRemovingItemEventArgs )
    Try
      m_northwind.Products.DeleteOnSubmit( TryCast( e.Item, Product ) )
      m_northwind.SubmitChanges()
    Catch e As Exception
      m_northwind.GetChangeSet().Deletes.Clear()
      e.Cancel = True
    End Try
    e.Handled = True
  End Sub
End Class
C#
Copy Code
public partial class Window1 : Window
{
 public Window1()
 {
   this.DataContext = this;
   InitializeComponent();
 }
 // QUERYABLE SOURCE
 public IQueryable QueryableSource
 {
   get
   {
     if( m_queryable == null )
     {
       m_northwind = new NorthwindDataContext();
       m_queryable = m_northwind.Products;
     }
     return m_queryable;
   }
 }
 private NorthwindDataContext m_northwind;
 private IQueryable m_queryable;
 // QUERYABLE INSERTION SUPPORT
 private void DataGridVirtualizingQueryableCollectionViewSource_CreatingNewItem( object sender, DataGridCreatingNewItemEventArgs e )
 {
   Product productToInsert = new Product();
   e.NewItem = productToInsert;
   m_northwind.Products.InsertOnSubmit( productToInsert );
   e.Handled = true;
 }
 private void DataGridVirtualizingQueryableCollectionViewSource_CommittingNewItem( object sender, DataGridCommittingNewItemEventArgs e )
 {
   try
   {
     m_northwind.SubmitChanges();
   }
   catch
   {
     e.Cancel = true;
   }
   e.Handled = true;
 }
 private void DataGridVirtualizingQueryableCollectionViewSource_CancelingNewItem( object sender, DataGridItemHandledEventArgs e )
 {
   m_northwind.GetChangeSet().Inserts.Clear();
   e.Handled = true;
 }
 // QUERYABLE EDIT SUPPORT
 private void DataGridVirtualizingQueryableCollectionViewSource_CommitItems( object sender, CommitItemsEventArgs e )
 {
   try
   {
     m_northwind.SubmitChanges();
   }
   catch
   {
     m_northwind.GetChangeSet().Updates.Clear();
   }
   finally
   {
     e.AsyncCommitInfo.EndCommit();
   }
 }
 // QUERYABLE DELETE SUPPORT
 private void DataGridVirtualizingQueryableCollectionViewSource_RemovingItem( object sender, DataGridRemovingItemEventArgs e )
 {
   try
   {
     m_northwind.Products.DeleteOnSubmit( e.Item as Product );
     m_northwind.SubmitChanges();
   }
   catch
   {
     m_northwind.GetChangeSet().Deletes.Clear();
     e.Cancel = true;
   }
   e.Handled = true;
 }
}