Вот отрывок из http://blogs.msdn.com/b/vinsibal/archive/2009/04/07/5-random-gotchas-with-the-wpf-datagrid.aspx:Каково использование IEditableObject с DataGrid?
5.Data элементы источник должны осуществлять IEditableObject, чтобы получить транзакционную функцию редактирования.
Если вы не знакомы с IEditableObject, см. Эту статью MSDN , в которой есть хорошее объяснение и пример кода. DataGrid испекла в функциональности для редактирования транзакций через интерфейс IEditableObject . Когда вы начинаете редактировать ячейку, DataGrid переходит в режим редактирования ячейки, а также режим редактирования строк. Это означает, что вы можете отменить/зафиксировать ячейки, а также отменить/зафиксировать строки. Например, I отредактируйте ячейку 0 и нажмите вкладку в следующую ячейку. Ячейка 0 фиксируется при нажатии клавиши . Я начинаю печатать в ячейке 1 и понимаю, что хочу отменить операцию . Я нажимаю «Esc», который возвращает ячейку 1. Теперь я понимаю, что я хочу отменить всю операцию, чтобы снова нажать «Esc», и теперь ячейка 0 возвращается к исходному значению.
Я получаю такое же транзакционное поведение даже без реализации IEditableObject. Что мне не хватает?
public class Person {
public string FirstName { get; set; }
public string LastName { get; set; }
public string Description { get; set; }
}
People = new List<Person> {
new Person(){FirstName = "fname", LastName = "lname", Description = "description"}
};
<DataGrid ItemsSource="{Binding Path=People}" />
Что делать, если операция базы данных не удалась? Я не думаю, что EndEdit() - хорошее место для работы с базой данных. – alice
@alice Затем вам придется обрабатывать ошибку соответственно. Он не обязательно должен быть базой данных, но это может быть и другой объект в памяти или любой другой объект, который вы не хотите, чтобы кто-либо касался, пока изменения не станут окончательными. Использование простого объекта с несколькими свойствами строки не является хорошим примером для IEditableObject. – Botz3000