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.