具有可编辑集合的MVVM示例,其中View不直接使用模型类型

Gor*_*ran 8 wpf mvvm

我看过很多人说模型类型不应该暴露给View,而是应该包含在ViewModel类型中.是否有一些示例我可以看到如何使用Entity Framework在ViewModel和Model数据之间完成同步.特别是,我需要一个可编辑集合的示例(例如:显示Customer列表的DataGrid或DataForm).

所以,这样的事情

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

但使用可编辑的集合数据,而不仅仅是只读.

我感兴趣的一个例子:

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

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

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

必须将产品类上的每个属性绑定到CustomerViewModel属性.您可以为代码和名称添加一些规则:

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

编辑:我主要关注的是我们如何在批量更新中实现ViewModel和EF Model之间的同步.一个例子是:

1)当删除Product时,如果我们从ProductViewModel集合和DBContext中删除它,当用户决定取消(出错或什么)时会发生什么?我们是否需要从数据库重新加载所有产品并重新创建所有ProductViewModels?

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

我有解决所有这些问题的方法,但我不确定它们是否正确,是否有更好的方法,所以我之所以要求在日常工作中使用这种方法的人提出其他意见.

Ale*_*der 2

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

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

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

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

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