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.