Silverlight 将模型列表显示给多个ViewModels,并使它们保持同步

Silverlight 将模型列表显示给多个ViewModels,并使它们保持同步,silverlight,windows-phone-7,mvvm-light,Silverlight,Windows Phone 7,Mvvm Light,我知道有很多关于如何处理模型和ViewModel集合的讨论,不同方面以及BLINQ、CLINQ、,MVVM包装工具包等。我仍然没有掌握这一点,我想找到一个很好的解决方案,在我目前的项目中的问题,如这里所述。主要区别在于我有几个ViewModels,它们公开相同的模型数据 我有一个相当简单的WP7项目,我使用MVVMLight和Messenger类作为中介。有一个从独立存储中提取的项目列表。几个(四个)不同的视图以不同的形式显示此数据。这三种方法都可以以不同的方式修改数据(ViewModel包含更

我知道有很多关于如何处理模型和ViewModel集合的讨论,不同方面以及BLINQ、CLINQ、,MVVM包装工具包等。我仍然没有掌握这一点,我想找到一个很好的解决方案,在我目前的项目中的问题,如这里所述。主要区别在于我有几个ViewModels,它们公开相同的模型数据

我有一个相当简单的WP7项目,我使用MVVMLight和Messenger类作为中介。有一个从独立存储中提取的项目列表。几个(四个)不同的视图以不同的形式显示此数据。这三种方法都可以以不同的方式修改数据(ViewModel包含更改的逻辑,而不是视图)

如果我使用ViewModel中的ObservableCollection在模型中包装列表,那么更改数据的ViewModel将修改其自己的ObservableCollection和模型中的列表。如果有一个ViewModel从模型中公开列表,我可能会这样做,这样ViewModel可以使自己和模型保持最新。然而,在这个项目中,我有几个消费者在同一个列表中,其他ViewModels中的ObservableCollections将不会被计算。为了纠正这种情况,我可以使用mediator模式并通知其他ViewModels项集合已更改,以便它们可以刷新它。我可以通过发送一条描述更改的消息来获得一些性能,而所有其他ViewModels都可以在内部执行相同的更改。但是,这需要我在一个中心位置共享一些逻辑,以避免在几个不同的ViewModel中重复添加/删除/更改逻辑

因为我需要将更改传达给其他ViewModels,所以我决定采用另一种方式。我将ObservableCollection更改为标准列表,并删除了处理更改通知的代码。因此,ViewModel和模型都具有列表对象。不管我是否将模型列表包装到ViewModel中,我都可以直接在ViewModel中公开Model.Items以简化事情(并可能获得一些性能)。现在,当某些ViewModel更改某些内容时,它将直接在模型中更改它,然后发送一条消息,说明items集合已更改,并且所有ViewModels都会在集合属性上引发一个属性更改通知

这似乎很有效。不过,我有两个顾虑:

  • 这是一个好的解决方案还是我以后会遇到问题?我是否完全针对MVVM做了一些从长远来看会损害代码基础的事情
  • 我感觉更改通知有时有点慢。也就是说,当我“单击”列表中的某个项目时,在更新列表之前会有一个小的延迟。我不确定这是因为我正在几个视图中刷新整个I列表,还是因为中介延迟

非常感谢您的任何想法/意见。

在这种情况下,您要做的部分决定取决于列表中对象的数量以及您对它们的操作量。无论采用哪种方法,请确保在真实设备上进行彻底测试,以验证性能

也就是说,我倾向于采用您所采取的方法来解决您的问题:
-它的简单性为将来提供了灵活性。
-由于它的简单性,其他开发人员将来应该能够更容易地理解代码


正如我之前所说,在真实设备上验证性能以确认是否存在问题。如果是问题,则在重新构建应用程序之前,先隔离瓶颈并解决它。

跟踪不同视图模型之间的相互通知更改,这将导致出现意大利面代码。我目前正在用一个复杂的Silverlight 4桌面应用程序来处理这个问题


我发现的解决方案是使用一个单独的ViewModel,其中包含将在其他ViewModel之间共享的数据。这样,您只有一个ObservableCollection—一个与您的数据一起驻留在视图模型中的集合。

Hmm,有趣的解决方案。我真的没有那样想过。这可能会缓解我下一个头疼的问题——动画。我想制作列表更改的动画(项目上移/下移、更改颜色、添加/删除等)。如果不知道到底是什么变化,我就不能真正地使它充满活力。通过在ObservableCollection上使用更改通知,我可以更好地控制根据更改触发哪个动画。是的,我同意性能方面的观点,在实际设备上感觉良好是绝对重要的。下周我会拿到手机,但在那之前我会尽可能多地完成。