在MVVM中创建ViewModel的最佳方法

时间:2009-12-22 06:14:59

标签: .net design-patterns mvvm

假设我有一个名为Customer的班级。现在我需要在视图上呈现客户。所以我创建了CustomerViewModel来用于绑定。我正在寻找创建CustomerViewModel类的最佳方法。以下是我对创建它的想法。

1 - 在视图模型上再次创建客户中的所有属性。将客户实例注入视图模型,每个属性将从该客户对象返回值。这种方法的优点是我可以为所有视图模型创建一个公共基类,并在那里转储常用功能。缺点是在视图模型上再次创建所有属性并进行维护所需的时间。

2 - 从客户处获取视图模型。所以我在视图模型中拥有所有客户的性质。但这不允许我使用公共基类并将常见的视图模型逻辑放在那里。

所以我想知道创建视图模型的最佳方法是什么?有没有比我想象的更好的替代方法?

3 个答案:

答案 0 :(得分:5)

您应该考虑在MVVM上阅读Josh Smith's article

他还有一个名为MVVM Foundation的框架,它有一个ViewModel基类。总的来说,我认为他实现ViewModel的方式总体上是最好的。

答案 1 :(得分:5)

选项1要好得多。原因是您希望能够独立地改变这两个层。在您的域模型和视图模型之间建立紧密耦合将在您希望避免的开发过程中引入刚性。

我处理必须编写这么多代码的方式是我没有。我使用T4 templates,一些合理的约定(默认情况下,属性显示在视图模型中;域模型类实现INotifyPropertyChanged并且这些约定向上),以及用于处理投影/展平的配置文件并生成视图模型。我还将它们生成为部分类,以便能够根据需要处理添加其他代码。

答案 2 :(得分:0)

如果您的原始Customer类不支持数据绑定,那么您将被迫创建一个viewmodel类并复制Customer类的属性。

但是,如果您的Customer类已经实现了对数据绑定的支持(它具有依赖项属性或实现了INotifyPropertyChanged),那么就没有根本原因导致您无法直接绑定Customer类的属性。

您当然可以考虑其他因素 - 您可能希望让viewmodel执行某些操作以响应属性更改,或者您可能不希望直接修改Customer对象。在这种情况下,您仍然希望包装Customer类。

此外,您可能希望通过IDataErrorInfo接口支持数据验证,在这种情况下,如果您的客户类没有实现此接口,您也可能需要将其包装起来。