Wpf 在多个视图中共享ViewModel的一个实例有什么优点吗?

Wpf 在多个视图中共享ViewModel的一个实例有什么优点吗?,wpf,mvvm,Wpf,Mvvm,我的一个同事提供了一种非常奇怪的方法,虚拟机像单例一样使用,每个虚拟机同时连接到多个视图。 除了一种数据共享而不是在数据访问层缓存之外,我认为这种奇怪的做法没有什么好处。 我从未在实践中看到过这一点,但我不想因此而拒绝这些想法。 另外,我说的是共享一个实例,而不是将不同的视图应用于一个VM 谢谢。如果要保持视图同步并使其看起来相同,我想这种方法可能会很有用。否则,我同意这是令人困惑的 我唯一一次看到在现实世界中使用的单实例视图模型是当您有一个也是单实例的视图时,这意味着在任何给定时间只允许打开该

我的一个同事提供了一种非常奇怪的方法,虚拟机像单例一样使用,每个虚拟机同时连接到多个视图。
除了一种数据共享而不是在数据访问层缓存之外,我认为这种奇怪的做法没有什么好处。
我从未在实践中看到过这一点,但我不想因此而拒绝这些想法。

另外,我说的是共享一个实例,而不是将不同的视图应用于一个VM


谢谢。

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


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

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

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


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

我想他是认真的。但我们之前决定使用MVVM Ligh的messenger来保持VM的同步。不,我们正试图使我们的虚拟机可重用和动态切换,但这是另一回事。是的,你是对的,Mvvm Light messenger是一个很好的选择,但是,你也需要小心。过度使用messenger会使应用程序变得非常复杂,因为注册了许多类,而且在注册后您需要注销这些类。当人们开始做这些事情时,询问他们在哪里看到了这种方法的优势,或者他们这样做的目的是什么,总是很有趣的。