MVVM模式中如何处理列表?

4
我有一个Silverlight WP7应用程序,正在应用MVVM模式。模型包含一系列类(类类型封装了股票代码数据),该列表与Item模板一起在View中使用。
我的理解是,为了使该列表与Binding配合工作,它需要是可观察的集合(仅引发PropertyChanged事件似乎没有任何效果)。
因此,我如何在我的模型(应该对展示无感知)和需要可观察集合的视图之间保持解耦?
目前,在我的View-Model中,我使用模型.List中的数据动态创建一个可观察集合。这似乎很笨拙。

你是否在每个属性的setter中明确地引发了PropertyChanged事件?如果是,那么你是在哪里和如何处理它? - Phil C
2个回答

3
只有两种方法可以解决这个问题:
1. 让Model本身公开一个ObservableCollection。这意味着你的ViewModel中不需要任何的hack,但是你可能会认为这只是将问题转移到了别处。
2. 让ViewModel公开它自己创建的ObservableCollection,就像你现在所做的那样。如果集合可以被更新(在你的场景中似乎不是这种情况),ViewModel也将需要“拥有”Model并将更改传播回List中。
我不认为你所做的是一个hack。Model绝对完全与演示(View)耦合分离,因为是ViewModel需要付出所有的努力来使事情运转。这完全符合MVVM的精神。

如果外部服务(如控制器)修改了模型中的基础List数据,那么怎样通知ViewModel呢? - Alan
1
@Alan:不是这样的。但考虑一下可能性:如果(a)您的设计涉及跨线程修改模型,则将ObservableCollection推入模型本身是有意义的,因为您将被迫提供解决问题的解决方案。如果相反(b)模型以单线程方式使用,则ViewModel知道它执行的操作中哪些可以导致List被更新。在这些情况下,它可以重新同步自己的ObservableCollectionList - Jon

1

我认为这不是一个临时应急方案,实际上,让你的模型公开一个可观察集合是最好的解决方案,特别是如果你要从外部源更新它。

你还有两个选择:使用来自任何可以更新列表的来源的中继命令告诉视图模型它需要重新同步,或在你的视图模型中添加一个处理程序到列表的itemadded事件,然后将该项添加到你的vm中的可观察集合中。


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