我正在使用MVVM模式编写一个相当大规模的WPF桌面应用程序。我一直陷入困境,无法使我的公共属性在更新它的视图之外的其他视图中更新。
我有一个包含ContentControl的RibbonWindow MainView,该ContentControl根据用户的选择一次显示其余视图。我有一个BaseViewModel类,所有ViewModel都扩展该类。除其他事项外,此类公开了INotifyPropertyChanged接口,并包含CommonDataStore类型的静态属性。此类还实现了INotifyPropertyChanged接口,并包含每个ViewModel都可用的属性。
尽管我可以从任何ViewModel访问并成功更新CommonDataStore属性,但问题是WPF Framework仅通知当前视图中已更改的属性。因此,尽管常见值已在其他ViewModel中更新,但其关联的视图不会更新。
我的应用程序中的一个示例是登录屏幕:随着用户登录,我的LogInView会使用来自数据库的新信息(即全名)进行更新,但MainView中的用户详细信息不会更新。
阅读了一些其他帖子后,我也尝试将CommonDataStore类实现为Singleton,但这并没有帮助。我也可以从MainViewModel将对此公共数据对象的引用传递给每个ViewModel的构造函数,但我不确定这是否是正确的方法。
我还发现,在WPF中,静态属性有点像常量值。似乎它们只读取一次值。
总之,我的尝试都失败了。我想知道标准方法是什么?特别是,我需要能够绑定到常见属性,并在更改任何常见值时更新所有ViewModel和Views。非常感谢您的帮助。提前致谢。
编辑>>真的吗?没有人在MVVM WPF应用程序中使用应用程序范围变量吗?
我现在已删除Common属性声明的静态部分,并仅将其副本逐个传递给每个ViewModel。这似乎有效,但我真的想知道其他人如何处理这种情况。请简单回答,让我知道您如何组织此应用程序范围数据。
我有一个包含ContentControl的RibbonWindow MainView,该ContentControl根据用户的选择一次显示其余视图。我有一个BaseViewModel类,所有ViewModel都扩展该类。除其他事项外,此类公开了INotifyPropertyChanged接口,并包含CommonDataStore类型的静态属性。此类还实现了INotifyPropertyChanged接口,并包含每个ViewModel都可用的属性。
尽管我可以从任何ViewModel访问并成功更新CommonDataStore属性,但问题是WPF Framework仅通知当前视图中已更改的属性。因此,尽管常见值已在其他ViewModel中更新,但其关联的视图不会更新。
我的应用程序中的一个示例是登录屏幕:随着用户登录,我的LogInView会使用来自数据库的新信息(即全名)进行更新,但MainView中的用户详细信息不会更新。
阅读了一些其他帖子后,我也尝试将CommonDataStore类实现为Singleton,但这并没有帮助。我也可以从MainViewModel将对此公共数据对象的引用传递给每个ViewModel的构造函数,但我不确定这是否是正确的方法。
我还发现,在WPF中,静态属性有点像常量值。似乎它们只读取一次值。
总之,我的尝试都失败了。我想知道标准方法是什么?特别是,我需要能够绑定到常见属性,并在更改任何常见值时更新所有ViewModel和Views。非常感谢您的帮助。提前致谢。
编辑>>真的吗?没有人在MVVM WPF应用程序中使用应用程序范围变量吗?
我现在已删除Common属性声明的静态部分,并仅将其副本逐个传递给每个ViewModel。这似乎有效,但我真的想知道其他人如何处理这种情况。请简单回答,让我知道您如何组织此应用程序范围数据。
Text="{Binding Common.CurrentEmployee.Name}"
。Common
是基类中的属性,而CurrentEmployee
则是CommonDataStore
类中的属性。我无法发布所有相关代码 - 太多了。我想问其他人是如何实现这个的,而不是要求特定修复我的代码。 - SheridanCommon
属性是static
的,所以是的,它在所有的ViewModel之间是共享的。我的视图中不需要进行Two-Way
绑定...登录使用一个调用LogInViewModel
中方法的Command
。该方法将用户登录并从数据库中检索用户详细信息。它更新了Common对象,但只有LogInView
中的详细信息被更新。CommonDataStore
中的所有属性都调用了INotifyPropertyChanged
系统,但是BaseViewModel
中的Common
属性不能调用,因为它是静态的。我还将其包装在一个非静态方法中,并调用了Notify...但没有帮助。 - Sheridan