DomainDataSource Extension Methods

A post by Jeff Handley explains how to add or edit an item in the DomainDataSource in .NET RIA Services, and a comment by David Yack on the forum provides his inherited DomainDataSource class which adds methods for adding and editing items. This code was then turned into a set of extension methods that can be used on any DomainDataSource.

To add a new item or edit an existing item in the DomainDataSource that ships with the .NET RIA Services, you must first cast the DataView property to an IEditableCollectionView. Jeff Handley does a good job of explaining the reason for this in his DomainDataSource.DataView post.

David Yack left a comment on the .NET RIA Services forum with a link to his post where he shares his inherited DomainDataSource class. The inherited class adds methods for adding and editing items that do all the casting to IEditableCollectionView for you. I really liked the idea but didn’t want to create my own derived class, so I took his implementation and turned it into a set of extension methods that are exposed on all DomainDataSource instances.

Update (24-09-2009): Added a Remove extension method. Thanks to Phil Steel for posting the code in his comment.

/// <summary>
/// Extensions to the <see cref="DomainDataSource"/> for adding and editing items.
/// </summary>
public static class DomainDataSourceExtensions
{
/// <summary>
/// Adds a new item to the collection.
/// </summary>
/// <typeparam name="T">The type of the item to add.</typeparam>
/// <param name="source">The <see cref="DomainDataSource"/> being extended.</param>
/// <returns>The newly added item.</returns>
public static T AddNew<T>(this DomainDataSource source)
{
IEditableCollectionView collection = ((IEditableCollectionView)source.DataView);
return (T)collection.AddNew();
}
/// <summary>
/// Edits an item in the collection.
/// </summary>
/// <param name="source">The <see cref="DomainDataSource"/> being extended.</param>
/// <param name="itemToEdit">The item to edit.</param>
public static void EditItem(this DomainDataSource source, object itemToEdit)
{
IEditableCollectionView collection = ((IEditableCollectionView)source.DataView);
collection.EditItem(itemToEdit);
}
/// <summary>
/// Removes an item from the collection.
/// </summary>
/// <param name="source">The <see cref="DomainDataSource"/> being extended.</param>
/// <param name="itemToRemove">The item to remove.</param>
public static void Remove(this DomainDataSource source, object itemToRemove)
{
IEditableCollectionView collection = ((IEditableCollectionView)source.DataView);
collection.Remove(itemToRemove);
}
/// <summary>
/// Commits the add or edit transaction.
/// </summary>
/// <param name="source">The <see cref="DomainDataSource"/> being extended.</param>
public static void CommitNewAndEdit(this DomainDataSource source)
{
IEditableCollectionView collection = ((IEditableCollectionView)source.DataView);
if (collection.IsAddingNew)
{
collection.CommitNew();
}
if (collection.IsEditingItem)
{
collection.CommitEdit();
}
}
/// <summary>
/// Cancels the add or edit transaction.
/// </summary>
/// <param name="source">The <see cref="DomainDataSource"/> being extended.</param>
public static void CancelNewAndEdit(this DomainDataSource source)
{
IEditableCollectionView collection = ((IEditableCollectionView)source.DataView);
if (collection.IsAddingNew)
{
collection.CancelNew();
}
if (collection.IsEditingItem)
{
collection.CancelEdit();
}
}
}

Thanks for sharing the code David.