常见的场景:具有项目模型集合的模型 .
例如,一个有人物集合的房子 .
How to structure this correctly for MVVM - particulary with regard to updating the Model and ViewModel collections with additions and deletes?
模型 House
包含模型 People
(通常为 List<People>
)的集合 .
视图模型 HouseVM
包含它包装的House对象和视图模型 PeopleVM
( ObservableCollection<PeopleVM>
)的ObservableCollection . 请注意,我们最终会在HouseVM中保存两个集合(需要同步):
HouseVM.House.List<People>
HouseVM.ObservableCollection<PeopleVM>
当House更新为新人(添加)或人员离开(删除)时,现在必须在两个集合中处理该事件,Model House People集合 AND 是VM HouseVM PeopleVM ObservableCollection .
Is this structure correct MVVM? Is there anyway to avoid having to do the double update for Adds and Removes?
2 回答
在这种情况下,我只是让模型暴露
ObservableCollection
而不是List
. 有's no particular reason why it shouldn' t .ObservableCollection
位于System
程序集的System.Collections.ObjectModel
名称空间中,因此没有不合理的额外依赖项,无论如何你几乎肯定都有System
.List
在mscorlib
中,但这与任何东西一样都是历史人工制品 .这大大简化了模型 - 视图模型的交互,我看不出不这样做的理由,在模型上使用
List
只会创建大量令人不快的样板代码 . 毕竟,你对这些活动很感兴趣 .另外,为什么你的
HouseVM
包裹ObservableCollection<PeopleVM>
而不是ObservableCollection<People>
?虚拟机用于绑定视图,因此我认为绑定到ObservableCollection<PeopleVM>
的任何内容实际上都对People
感兴趣,否则你通常会有一个虚拟机暴露其他虚拟机,但也许这只是我 .Edit about libraries/WCF
我不直接暴露事件 . 如果你因为必须链接多个更新而感到困惑,尽管我想知道你是否真的只是手动执行与事件在_240073中相同的工作,除非我误解了其中的一些 .
就个人而言,就像我说的那样,我会让VM保持简单,并让它们暴露最小值而不暴露其他虚拟机 . 它可能需要一些重新设计,并使某些部件有点痛苦(例如,
Converter
s,然而,你最终得到一个简单,易于管理的设计,边缘有一些易于处理的烦恼 .在我看来,你现在的路线很快会变得非常复杂,最重要的是,尴尬地跟随...但是,YMMV,这只是我的经验:)
也许将一些逻辑转移到显式服务可能会有所帮助?
你的一般方法是完美的MVVM,让ViewModel公开其他ViewModel的集合是一个非常常见的场景,我在这里使用它 . 我不建议直接在ViewModel中公开项目,比如nicodemus13说,因为你最终将视图绑定到没有ViewModel的模型,用于你的集合项目 . 所以,你的第一个问题的答案是:是的,这是有效的MVVM .
您在第二个问题中解决的问题是您的房屋模型中的人员模型列表与您的房屋ViewModel中的ViewModel人员列表之间的同步 . 您必须手动执行此操作 . 所以,没有办法避免这种情况 .
你可以做什么:实现一个自定义
ObservableCollection<T>
,ViewModelCollection<T>
,它也将它's changes to an underlying collection. To get two way synching, make the model'的集合推送到ObservableCollection <>并注册到ViewModelCollection中的CollectionChanged
事件 .这是我的实施 . 它使用ViewModelFactory服务等,但只需查看一般主体 . 我希望它有帮助......