2012-06-05 23 views
2

下面是摘自http://blogs.msdn.com/b/vinsibal/archive/2009/04/07/5-random-gotchas-with-the-wpf-datagrid.aspxIEditableObject與DataGrid的用法是什麼?

5.Data源項目應該實現IEditableObject得到事務編輯功能。

如果您對IEditableObject不熟悉,請參閱此MSDN文章 ,它有很好的解釋和代碼示例。 DataGrid通過IEditableObject 接口烘焙了 的事務編輯功能。當您開始編輯單元格時,DataGrid將進入單元格 編輯模式以及行編輯模式。這意味着你可以取消/提交單元格以及取消/提交行。例如,I 編輯單元格0並按Tab鍵到下一個單元格。當按下標籤 時,單元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

相關問題