我已经开发了一些基于MVVM的WPF代码,并且需要进行一些小的重构,但是在此之前,我需要确定最佳的体系结构。

我最初从一个应用程序开始,该应用程序可以呈现我的数据的几种相似(但独立)的表示形式。我们将其称为RecordsViewModel,它具有一个对应的RecordsView。随着时间的流逝,我介绍了一个SettingsViewModel,它被传递到RecordsViewModel的构造函数中并以可见的方式发布(允许RecordsView使用它)。 SettingsViewModel已注册到,以便更改反射(reflect)在我的所有 View 中。

现在,我想对RecordsView进行一点拆分,因为它现在包含两个不同的 View 。

我的问题是:

  • 新的(RecordsMainViewRecordsAlternativeView)都想查看“设置”。
  • 与以编程方式实例化的早期RecordsView不同,这些新 View 是从Xaml(默认构造函数)实例化的。

  • 所以我的选择似乎是:
  • 向上移动树模型以查找具有设置
  • 的父级
  • 使控件上的设置成为DependencyProperty,并使Xaml将Property加入实例。
  • 使SettingsViewModel为单例。

  • 还有其他更好的选择吗?您认为哪一个最好?

    最佳答案

    我会将您的设置逻辑转换为服务(ISettingsService),并使用服务定位器或依赖项注入(inject)从任何需要 View 模型的 View 中获取该服务。

    服务非常适合管理共享状态,服务定位器/DI使您的VM轻松获得对服务的引用。在虚拟机中存储共享状态有点麻烦,而且-正如您所发现的-并不能真正扩展。一个好的经验法则可能是问自己,VM中的状态是否仅是为了支持相应的 View 而存在,还是其他组件是否需要访问该状态。如果是后者,则将其移至服务中。

    10-07 19:21