我已经开发了一些基于 MVVM 的 WPF 代码,并且需要进行一些小的重构,但在此之前我需要确定最佳架构。
我最初是从一个应用程序开始的,该应用程序可以呈现多个相似(但独立)的数据表示形式。我们称它为 RecordsViewModel
,它有一个相应的 RecordsView
。随着时间的推移,我引入了一个 SettingsViewModel
,它被传递到 RecordsViewModel
的构造函数中并公开发布(允许 RecordsView
使用它)。 SettingsViewModel
已注册,以便更改反射(reflect)在我的所有 View 中。
现在我想稍微拆分一下 RecordsView
,因为它现在包含两个不同的 View 。
我遇到的问题是:
- 新的(
RecordsMainView
和RecordsAlternativeView
)都希望看到设置。 - 与早期以编程方式实例化的
RecordsView
不同,这些新 View 是从 Xaml(默认构造函数)实例化的。
所以我的选择似乎是:
- 向上遍历树模型以找到具有设置的父级
- 将控件设置为
DependencyProperty
,并使 Xaml 将属性加入到实例中。 - 将
SettingsViewModel
设为单例。
还有其他更好的选择吗?您认为哪个最好?
最佳答案
我会将您的设置逻辑转换为服务 (ISettingsService
),并使用服务定位器或依赖项注入(inject)从需要它的任何 View 模型中获取该服务。
服务非常适合管理共享状态,服务定位器/DI 使您的虚拟机很容易获得对服务的引用。在 VM 中存储共享状态有点老套,而且——正如您所发现的——并不能真正扩展。一个好的经验法则可能是问问自己 VM 中的状态是否只是为了支持相应的 View 而存在,或者其他组件是否需要访问该状态。如果是后者,请将其移至服务中。
关于c# - MVVM 模式和半全局数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1286891/