8

我读过很多人说模型类型不应该暴露给 View,而是应该包装在 ViewModel 类型中。有没有一些例子,我可以看到 ViewModel 和 Model 数据之间的同步是如何使用实体框架完成的。特别是,我需要一个可编辑集合的示例(例如:显示客户列表的 DataGrid 或 DataForm)。

所以,像这样

http://msdn.microsoft.com/en-us/magazine/dd419663.aspx

但具有可编辑的集合数据,而不仅仅是只读的。

我感兴趣的一个例子:

1)网格需要显示产品。显示 3 列:

  • 产品代码
  • 产品名称
  • 产品类别
  • 产品单元

Type 是一个枚举,可以说:ProductType { TypeA, TypeB }。如果您发现难以实现枚举,那么将其设置为 int,这不是问题。重要的是,如果 Product 已在其他表中用作参考,则无法更改类型。我正在使用此规则,因为您不能使用属性(数据注释)执行此操作,并且需要在 ViewModel 端完成。

产品类的每个属性都必须绑定到 CustomerViewModel 属性。您可以为代码和名称设置一些规则:

代码唯一名称:必填,MaxLength(30)

编辑:我主要关心的是我们如何在批量更新中在 ViewModel 和 EF 模型之间进行同步。一个例子是:

1) 当移除 Product 时,如果我们从 ProductViewModel 集合和 DBContext 中移除它,当用户决定取消时会发生什么(犯了一个错误或任何事情)?我们是否需要从数据库中重新加载所有 Product 并重新创建所有 ProductViewModel?

2)用户更改产品并将产品置于无效状态(请记住,对象仍然可以接受无效状态,除非我们决定将其刷新到数据库)。然后用户将光标移动到另一个产品,更改它(该产品保持有效状态),并执行保存命令。到时候我们应该怎么做?

我对所有这些问题都有自己的解决方案,但我不确定它们是否正确,是否有更好的方法,所以我向在日常工作中使用这种方法的人征求其他意见的原因。

4

1 回答 1

2

如果您需要批量更新能力,那么应用程序需要一些更新:

1) 不要从 ProductViewModel 调用 SaveChanges。更改应仅在按下“保存”按钮时保存

2) 在 MainViewModel 中,您需要维护两个额外的集合:用于新项目和已删除项目。当用户按下“保存”按钮时,删除的项目将从数据库中删除,新项目将添加到数据库中。

3)当用户按下“取消”按钮时,所有更改都应还原。即所有字段都应该恢复到原来的状态,删除的项目应该被添加回来,新的项目应该被删除

请参阅 github 上的更新:https ://github.com/alexshakurin/EditableDataGridMVVM

于 2012-09-27T07:48:54.520 回答