MVVM:我应该如何将ViewModel转换为模型?

时间:2010-05-18 15:14:04

标签: wpf django-models model viewmodel

每个人都谈到通过视图模型包装模型。到目前为止很好。

但是当我想要坚持我的模型时,如何将ViewModel转换为模型?

将ViewModel中的所有属性读入新的Model对象看起来非常麻烦。

有更好的方法吗?

4 个答案:

答案 0 :(得分:1)

我正在将旧的winforms应用程序转换为wpf mvvm应用程序,我只是在我的viewmodel上提供了一个指向模型实际实例的属性。

从我的角度来看,在viewmodel中创建模型的副本是没有意义的,我认为无论如何MVVM社区都没有这么说。

当您开始使用实体框架或其他一些数据库orm时,它尤其没有意义,因为实体框架具有支持开箱即用的数据绑定的属性。另外,当您开始对数据库进行更改时,您必须更新模型和视图模型。

编辑:你是对的,因为ef不支持INotifyCollectionChanged,但据我所知,它确实支持INotifyPropertyChanged,从它的外观来看,Microsoft正在考虑实现INotifyCollectionChanged在将来的版本中。

我认为MVVM没有正确或错误的方式 - 我认为网络上的每个不同的“权威”都有自己的解释方式。

答案 1 :(得分:0)

我们的想法是为用户界面制作ViewModel。换句话说,一个WPF表单有一个ViewModel,而ViewModel实际上可能使用多个模型(客户,订单等)。如果您的表单只处理一个模型,那么它将接近1对1映射。

答案 2 :(得分:0)

仅在需要时将模型包装在视图模型中,否则视图将直接绑定到模型的属性。一个例子: 模型1:员工列表(员工有姓名和部门) 模型2:部门清单。 查看:显示员工和部门列表。当用户选择部门时,员工列表会被过滤。 ViewModel:提供当前选定的部门属性和筛选的员工列表。

View会直接针对模型1对部门列表进行数据绑定,但是针对viewmodel将当前所选部门和过滤后的员工列表进行数据绑定。 Viewmodel将根据所选部门过滤员工列表。

答案 3 :(得分:0)

如果您不想复制属性,我建议使用常规模型和Django>=1.4 proxy models

  • 使用常规模型来保存您的数据和
  • 使用视图模型时使用代理模型。

通过继承原始模型并将proxy = True添加到模型Meta中,可以轻松定义代理模型,例如

class MyProxyModel(MyModel):
    class Meta(MyModel.Meta):
        proxy = True

    # Add here the desired view model methods...

请注意,代理模型不需要在models.py中定义 - 我经常在管理网站上使用代理模型,并在admin.py中定义它们。

希望这有帮助,或者像我这样的其他后来者可以使用它。

相关问题