2010-05-18 71 views
1

每个人都在谈论通过视图模型包装模型。罚款到目前为止。MVVM:我应该如何将ViewModel转换为模型?

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

将ViewModel中的所有属性读入一个新的Model对象似乎非常麻烦。

有什么更好的方法?

回答

1

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

从我的角度来看,在视图模型中创建模型的副本是没有意义的,我不认为MVVM社区是这样说的。

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

编辑:你说得对,EF不支持INotifyCollectionChanged,但据我所知,它不支持INotifyPropertyChanged的,从外观上来看,微软正在考虑在将来的版本中实现INotifyCollectionChanged的。

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

+0

回答一个很模糊...... 副本...:萨沙理发(WPF弟子)正在复制他的CustomerModel与域的客户,只需要检查他的臭虫框架示例应用程序 - 我没有提到EF,但如果你提到它,EF实体不支持INotifyCollectionChanged。 “ – msfanboy 2010-05-18 17:59:31

+0

”...对数据库进行更改,必须更新模型和视图模型....“ 不正确,因为模型已委托给视图模型。 样品CustomerViewModel.cs: 公共字符串姓 { 设置 { _customerObject.FirstName =值; } } 的modelObject注入到视图模型构造函数;-) 但是这会导致问题做集结模型成的ViewModels ......但那是另一回事。 – msfanboy 2010-05-21 17:40:44

0

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

+0

你看过我的问题吗? “ – msfanboy 2010-05-18 17:56:21

0

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

查看将直接针对模型1数据绑定部门列表,但针对视图模型将当前选定的部门和过滤的员工列表数据绑定。 Viewmodel将根据所选部门筛选员工名单。

+0

”...否则视图将直接绑定到您的模型的属性....“ =>严格建议不要在MVVM模式中执行此操作! – msfanboy 2010-05-18 18:01:45

+0

我以为你问了一个比严格遵循MVVM更好的方法。纯粹的MVVM会导致代码维护问题,因为您需要这么多的代码才能在模型和虚拟机之间复制状态。由于数据是重复的,因此MVVM应用程序将具有高内存消耗。 – 2010-05-18 19:07:40

+0

你知道我现在做了什么吗? 其实我很高兴我用3个聚合视图模型和MVVM管理了一个三级主控细节,并且我意识到这些都是为了学习而不是实际使用的...... 这么多开销和所有复制属性和经常我的...我怎么能说我可以说的代码流...当我尝试按照mvvm打破。 现在我只是一个ViewModel绑定到UserControls datacontext包含3聚合实体不viewmodels什么节省很多时间没有转换/返回属性和列表... – msfanboy 2010-05-18 20:04:07

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定义它们。

希望这可以帮助或像我这样的其他迟到者可以使用这个。

相关问题