2009-12-22 49 views
8

假设我有一个名为Customer的类。现在我需要呈现客户。所以我创建了CustomerViewModel用于绑定。我正在寻找创建CustomerViewModel课程的最佳途径。以下是我对创建它的想法。在MVVM中创建ViewModel的最佳方法

1 - 在视图模型上再次创建客户中的所有属性。将客户实例注入视图模型,并且每个属性都会重新映射此客户对象的值。这种方法的好处是我可以为所有的视图模型创建一个通用的基类,并且在那里有共同的功能。缺点将是在视图模型上再次创建所有属性并进行维护所需的时间。

2 - 从客户派生视图模型。所以我拥有所有视图模型中的客户的功能。但是这不会允许我使用一个通用的基类,并将常见的视图模型逻辑放在那里。

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

+0

需要多长时间才能在ViewModel中重复模型属性?能够放入一些转换器或触发器用于显示目的,这使得我值得额外的分钟。如果您有许多控件的复杂视图,请将模型作为视图模型中的属性添加,并在视图中绑定到Model.Property。 – adrianm 2009-12-22 07:20:57

+2

我会避开#2。我不认为你总是会找到一个明确的模型类和ViewModel之间的映射。为了可维护性,我将与其他一些可能在逻辑上位于Custom模型前面的类一起使用,但也可能将其他模型类型在将来展示给视图。 – 2009-12-28 17:29:26

回答

5

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

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

+0

我已经看到了。他正在采用我在第1点中描述的方法。 – 2009-12-22 06:28:19

+0

是的......我认为这是最好的方法。我从事过一个有100多个ViewModel的项目,这是最好的方法,也是最容易维护的。 希望能帮到你 – 2009-12-22 06:32:00

0

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

但是,如果您的客户类已经实现了对数据绑定的支持(它具有依赖属性或者实现INotifyPropertyChanged),那么没有根本原因不能直接绑定客户类的属性。

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

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

5

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

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