c# - MVVM 模式和半全局数据

标签 c# wpf mvvm

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

我最初是从一个应用程序开始的,该应用程序可以呈现多个相似(但独立)的数据表示形式。我们称它为 RecordsViewModel,它有一个相应的 RecordsView。随着时间的推移,我引入了一个 SettingsViewModel,它被传递到 RecordsViewModel 的构造函数中并公开发布(允许 RecordsView 使用它)。 SettingsViewModel 已注册,以便更改反射(reflect)在我的所有 View 中。

现在我想稍微拆分一下 RecordsView,因为它现在包含两个不同的 View 。

我遇到的问题是:

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

所以我的选择似乎是:

  1. 向上遍历树模型以找到具有设置的父级
  2. 将控件设置为 DependencyProperty,并使 Xaml 将属性加入到实例中。
  3. SettingsViewModel 设为单例。

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

最佳答案

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

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

关于c# - MVVM 模式和半全局数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1286891/

相关文章:

c# - 我应该在这里使用工厂吗

WPF CEFSharp ChromiumWebBrowser - 渲染内存流

wpf - WPF,如何在可拖动元素内拖动对象?

c# - 错误 CS0103 : The name ' ' does not exist in the current context

c# - WPF 比粗体更粗

c# - 更改网格中行的背景颜色

c# - 如何在不弄乱 DataContext 的情况下为 WPF 工具提示设置 PlacementTarget?

wpf - MVVM-Light/WPF 导航应用

c# - 来自 ItemsControl 项目的 RelayCommand 发送者

c# - 为什么不调用此命令?