【问题标题】:What is the usage of IEditableObject with DataGrid?IEditableObject 与 DataGrid 的用途是什么?
【发布时间】:2012-06-05 09:56:43
【问题描述】:

这是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}" />

【问题讨论】:

    标签: wpf datagrid ieditableobject


    【解决方案1】:

    当然,对于内存中的简单字符串来说,这并不重要。但是IEditableObject 有一些用途。
    例如,假设您想将每条已编辑的记录存储到数据库中。您可能希望在一个事务中提交所有更改,该事务将在EndEdit() 中。其他接口方法也有类似的用途。

    此外,您并不总是直接编辑绑定的对象。您的 IEditableObject 实例可能包含另一个类型的变量,它是实际的数据源。在这种情况下调用 EndEdit() 之前,您不会应用编辑的值,CancelEdit() 将从原始数据源恢复值。

    【讨论】:

    • 数据库操作失败怎么办?我不认为 EndEdit() 是进行数据库操作的好地方。
    • @alice 然后你必须相应地处理错误。但它不一定是数据库,它也可以是另一个内存中的对象,或者在最终更改之前您不希望任何人接触的任何其他对象。使用只有几个字符串属性的普通对象并不是 IEditableObject 的好例子。
    猜你喜欢
    • 1970-01-01
    • 2012-06-03
    • 2011-05-25
    • 1970-01-01
    • 2010-09-27
    • 2011-12-17
    • 2010-11-21
    • 1970-01-01
    相关资源
    最近更新 更多