Я вижу два варианта
. Во-первых, вы можете подписаться на событие PropertyChanged каждого объекта в ObservableCollection и на событие CollectionChanged ObservableCollection, чтобы синхронизировать эти 2 структуры данных
, а во-вторых, чтоЯ думаю, что проще реализовать, это создать свойство с неизмененными, добавленными, измененными, удаленными перечислениями в вашем классе, установить это свойство в зависимости от действий пользователя и преобразовать его в DataSet при сохранении
РЕДАКТИРОВАТЬ
Вот простая реализация для второго метода
создайте перечисление вот так
public enum DataObjectState
{
Unchanged,
Added,
Modified,
Deleted
}
Чем добавьте свойство в свой класс вот так
public class Person
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
public DataObjectState ObjectState{get;set;}
}
, после чего вы можете создать набор данных формы ObservableCollection, как вы показываете
dataset.Tables["Person"].AsEnumerable().Select(p => new Person
{
Id = p.Field<int>("Id"),
Name = p.Field<string>("Name"),
Age = p.Field<int>("Age"),
ObjectState = ConvertRowStateToObjectState(p.RowState)
}));
, и можете конвертировать из наблюдаемой коллекции в набор данных, используя противоположный запрос
EDIT
private DataObjectState ConvertRowStateToObjectState(DataRowState dataRowState)
{
return (DataObjectState)Enum.Parse(typeof(DataObjectState), dataRowState.ToString());
}
Я не нахожу способ создать набор данных и с Linq, но вот немного хакерский метод, чтобы сделать то, что вы хотите
DataTable personsTable = new DataTable("Person");
personsTable.Columns.Add("Id", typeof(int));
personsTable.Columns.Add("Name", typeof(string));
personsTable.Columns.Add("Age", typeof(int));
foreach (var item in collection)
{
DataRow row = personsTable.NewRow();
row["Id"] = item.Id;
row["Name"] = item.Name;
row["Age"] = item.Age;
personsTable.Rows.Add(row);
if (item.ObjectState == DataObjectState.Added)
{
continue;
}
row.AcceptChanges();
if (item.ObjectState == DataObjectState.Deleted)
{
row.Delete();
}
else if (item.ObjectState == DataObjectState.Modified)
{
row.BeginEdit();
row.EndEdit();
}
}