在几个Views中共享一个ViewModel实例有什么优点吗?

时间:2013-02-11 20:23:51

标签: wpf mvvm

我的一个同事提供了一种奇怪的方法,其中VM像单身人士一样使用,每个人同时连接到多个视图。
除了一种数据共享而不是数据访问层的缓存之外,我认为没有这种奇怪的优点 我在实践中从来没有见过这个但是不想仅仅因为这个而拒绝这些想法。

P.S。我谈到共享一个实例,而不是将差异视图应用于一个VM。

感谢。

3 个答案:

答案 0 :(得分:4)

我认为如果要使视图保持同步并使其看起来相同,则此方法可能很有用。否则,我同意这令人困惑。

我唯一一次看到现实世界中使用的单例视图模型,当你的视图也是单个实例时,意味着在任何给定时间只允许打开一个视图副本。在这种情况下,有一个性能优势,因为每次重新打开视图时都不必重新创建视图模型。

答案 1 :(得分:1)

理论上你必须为每个视图都有一个视图模型,但我认为在某些情况下可能会对不同视图使用相同的视图模型。例如,假设您正在不同应用程序的位置显示用户,并且您希望当User.Name在应用程序的位置更改时,同样在显示用户的所有其他位置,User.Name也会更改。对于此通知问题,最好只有一个视图模型,然后使用INotifyPropertyChanged接口将通知所有视图。我认为这是你的同事可能想要的,但也不好过度使用它,因为会增加应用程序的复杂性,和/或可能带来一些意想不到的行为。

答案 2 :(得分:1)

我不确定我是否一定称它为“单例”视图模型,但我喜欢在某些情况下在多个视图控件之间共享视图模型实例。例如,这在主/细节场景中非常有用,在这种情况下,您对细节所做的更改可能会改变主要部件在视觉上的外观。例如,列表/树视图旁边有一个编辑面板,显示所选项目的详细信息。当然,你可以通过在两个虚拟机之间传递消息来做这种事情,但 似乎更有可能添加额外的代码而不是虚拟机重用。

如果您需要某种主/细节方案,其中详细信息编辑是模态的,就像在打开进行更改的对话框中一样,我不建议使用完全单独的VM。在那里,您将要在单独的实例中封装编辑,以使取消支持更容易。应用程序 - 全局(例如静态)单例实现只会使这种事情变得更加混乱。