我正在使用 MVVM 模式编写一个规模相当大的 WPF 桌面应用程序。我已经有一段时间无法让我的公共(public)属性在更新它的 View 之外的 View 中更新。
我有一个 RibbonWindow MainView
,它包含一个 ContentControl
,它根据用户的选择一次显示一个剩余的 View 。我有一个所有 ViewModel 都扩展的 BaseViewModel
类。除其他外,此类公开了 INotifyPropertyChanged 接口(interface)并包含 CommonDataStore
类型的 static
属性。此类还实现了 INotifyPropertyChanged 接口(interface)并包含可用于每个 ViewModel 的属性。
现在,虽然我可以从任何 ViewModel 访问并成功更新 CommonDataStore
属性,但问题是 WPF 框架只会通知当前 View 中已更改的属性。因此,尽管公共(public)值已在其他 ViewModel 中更新,但它们的关联 View 不会更新。
我的应用程序的一个示例是登录屏幕:当用户登录时,我的 LogInView 会更新数据库中的新信息(即全名),但 MainView 中的用户详细信息不会。
阅读其他几篇文章后,我还尝试将 CommonDataStore
类实现为单例,但这没有帮助。我也可以将对这个公共(public)数据对象的引用传递给 MainViewModel
中每个 ViewModel 的构造函数,但我不确定这是否是正确的方法。
我还发现,在 WPF 中,static
属性的处理方式有点像常量值。似乎他们只读取了一次值。
所以无论如何很明显,我的尝试都失败了。我想知道这样做的标准方法是什么?特别是,我需要能够绑定(bind)到公共(public)属性,并在任何公共(public)值更改时更新我的所有 ViewModel 和 View 。任何帮助将不胜感激。非常感谢。
编辑>> 真的吗?没有人在 MVVM WPF 应用程序中使用应用程序范围的变量?
我现在已经删除了 Common 属性声明的静态部分,并且只是将一个副本分别传递到每个 ViewModel。这似乎可行,但我真的很想知道其他人如何处理这种情况。请通过简单地告诉我您如何组织此应用程序范围内的数据来回答。
最佳答案
我做了一些类似于你最后描述的事情。我有一个名为 SecurityContext 的类,它包含一些应用程序范围的数据。当应用程序启动时创建一个实例,然后该实例通过依赖注入(inject)传递到所有 ViewModel 的构造函数中。我有一个 ViewModels 的基类,它通过常规实例属性(实现 INotifyPropertyChanged)公开该对象。
关于wpf - 如何在 WPF MVVM 应用程序中处理可绑定(bind)应用程序范围的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5861829/