2012-06-05 2 views
2

Вот отрывок из 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}" /> 

ответ

2

Конечно, это не имеет большого значения для простой строки в памяти. Но есть использование для IEditableObject.
Например, представьте, что вы хотите сохранить каждую отредактированную запись в базе данных. Вероятно, вы захотите зафиксировать все изменения в одной транзакции, которая будет в EndEdit(). Аналогичные применения могут быть найдены для других методов интерфейса.

Кроме того, вы не всегда непосредственно редактируете связанный объект. Ваш экземпляр IEditableObject может содержать переменную другого типа, которая является фактическим источником данных. Вы не применяли отредактированные значения до тех пор, пока в этом случае не будет вызвано EndEdit(), и CancelEdit() восстановит значения из исходного источника данных.

+0

Что делать, если операция базы данных не удалась? Я не думаю, что EndEdit() - хорошее место для работы с базой данных. – alice

+0

@alice Затем вам придется обрабатывать ошибку соответственно. Он не обязательно должен быть базой данных, но это может быть и другой объект в памяти или любой другой объект, который вы не хотите, чтобы кто-либо касался, пока изменения не станут окончательными. Использование простого объекта с несколькими свойствами строки не является хорошим примером для IEditableObject. – Botz3000