我的一位同事提供了一种非常奇怪的方法,其中 VM 像单例一样使用,并且每个都同时附加到多个视图。
除了一种数据共享而不是在数据访问层缓存之外,我认为这种怪异没有任何优点。
我在实践中从未见过这种情况,但我不想仅仅因为这个而拒绝这些想法。
PS 我说的是共享一个实例,而不是对一个 VM 应用不同的视图。
谢谢。
我想如果要使视图保持同步并使其看起来相同,这种方法可能会很有用。否则,我同意这是令人困惑的。
我唯一一次看到现实世界中使用的单例视图模型是当您有一个也是单实例的视图时,这意味着在任何给定时间只允许打开视图的一个副本。在这种情况下,有一个性能优势,因为每次重新打开视图时都不必重新创建视图模型。
我不确定我是否一定会称它为“单例”视图模型,但在某些情况下,我喜欢在多个视图控件之间共享视图模型实例。例如,这在主/细节场景中非常有用,您对细节所做的更改可能会改变主零件的视觉外观。例如,列表/树视图旁边有一个编辑面板,显示所选项目的详细信息。当然,您可以通过在两个 VM 之间传递消息来做这种事情,但这似乎更有可能添加额外的代码而不是 VM 重用。
我不建议使用完全单例 VM 的地方是,如果您需要某种主/细节场景,其中细节编辑是模态的,例如在您打开以进行更改的对话框中。在那里,您将希望将编辑封装在一个单独的实例中,以使取消支持更容易。应用程序全局(例如静态)单例实现只会让这种事情变得更加混乱。
理论上,每个视图都必须有一个视图模型,但我认为在某些情况下,将相同的视图模型用于不同的视图可能很有用。例如,假设您在不同应用程序的位置显示用户,并且您希望当用户名称在应用程序的位置更改时,以及在显示用户的所有其他位置,用户名称也发生更改。对于这个通知问题,最好只有一个视图模型,然后使用该INotifyPropertyChanged
接口通知所有视图。我认为这是您的同事可能想要的,但也不好过度使用它,因为会增加应用程序的复杂性,和/或可能带来一些意想不到的行为。