MVVM中创建ViewModel的最佳方法是什么?

8
假设我有一个名为 Customer 的类。现在我需要在视图上呈现客户。因此,我创建了 CustomerViewModel 以用于绑定。我正在寻找创建 CustomerViewModel 类的最佳方法。以下是我关于创建它的想法。
1- 在视图模型中重新创建客户的所有属性。将客户实例注入到视图模型中,每个属性都将从该客户对象返回值。这种方法的优点是,我可以为所有视图模型创建一个通用的基类,并在那里放置常见的功能。缺点是需要花费时间在视图模型中重新创建所有属性并进行维护。
2- 从客户中派生视图模型。因此,我在视图模型中拥有客户的所有属性。但这将不允许我使用共同的基类并在那里放置共同的视图模型逻辑。
所以我想知道创建视图模型的最佳方法是什么?是否有比我想到的更好的替代方法?

你重复ViewModel中的模型属性需要多长时间?对于我来说,能够添加一些转换器或触发器以进行显示是值得额外花费几分钟的。如果你有一个包含许多控件的复杂视图,请将模型作为ViewModel中的属性添加,并在视图中绑定到Model.Property。 - adrianm
3
我建议避开第二种选项。我认为你不会总是能够找到一个特定模型类和ViewModel之间的清晰映射关系。为了可维护性,我建议选择一些其他类,这些类可能会逻辑上位于Custom模型之前,但也可以将来向视图公开其他模型类型。 - Jason Jackson
3个回答

6
Option 1更好。原因是您希望能够独立地变化这两个层。在领域模型和视图模型之间存在紧密耦合会引入开发过程中的僵化,您应该避免这种情况。
我处理写那么多代码的方式是不写。我使用T4 templates,一些合理的约定(默认情况下,属性显示在视图模型中;领域模型类实现INotifyPropertyChanged并向上委托),以及一个配置文件来处理投影/展平并生成视图模型。我还将它们生成为部分类,以便能够根据需要添加其他代码。

5

您应该考虑阅读Josh Smith的文章,内容与MVVM相关。

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


我已经看过了。他正在执行我在第一点中描述的方法。 - Navaneeth K N
是的...我认为这是最好的方法。我曾经参与过一个拥有100多个ViewModel的项目,这是最好的方法,也是最容易维护的方法。希望这可以帮到你。 - Chris Nicol

0

如果您的原始Customer类不支持数据绑定,则必须创建一个viewmodel类并复制Customer类的属性。

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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接