2

http://blogs.msdn.com/b/vinsibal/archive/2009/04/07/5-random-gotchas-with-the-wpf-datagrid.aspxからの抜粋は次のとおりです。

5. データ ソース アイテムは、IEditableObject を実装してトランザクション編集機能を取得する必要があります。

IEditableObject に慣れていない場合は、適切な説明とコード サンプルが記載されているこの MSDN の記事を参照してください。DataGrid には、IEditableObject インターフェイスを介したトランザクション編集の機能が組み込まれています。セルの編集を開始すると、DataGrid はセル編集モードと行編集モードになります。これが意味することは、行をキャンセル/コミットするだけでなく、セルをキャンセル/コミットできるということです。たとえば、セル 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}" />
4

1 に答える 1

2

もちろん、メモリ内の単純な文字列の場合はそれほど重要ではありません。しかし、用途はありIEditableObjectます。
たとえば、編集したすべてのレコードをデータベースに保存するとします。おそらく、すべての変更を 1 つのトランザクションでコミットしたいと思うでしょうEndEdit()。他のインターフェイス メソッドにも同様の用途があります。

また、バインドされたオブジェクトを常に直接編集しているわけではありません。インスタンスIEditableObjectは、実際のデータ ソースである別の型の変数を保持している可能性があります。EndEdit()その場合、 が呼び出されるまで編集した値を適用せずCancelEdit()、元のデータ ソースから値を復元します。

于 2012-06-05T10:09:17.137 に答える