如何在WPF MVVM应用程序中处理可绑定的应用程序范围的变量?

时间:2011-05-02 19:55:24

标签: wpf variables mvvm desktop-application

我正在使用MVVM模式编写一个相当大规模的WPF桌面应用程序。我已经停留了一段时间,让我的公共属性在更新它的视图之外进行更新。

我有一个RibbonWindow MainView,其中包含一个ContentControl,可以根据用户的选择一次显示一个剩余的视图。我有一个BaseViewModel类,所有ViewModel都扩展。除此之外,此类公开INotifyPropertyChanged接口并包含static类型的CommonDataStore属性。此类还实现了INotifyPropertyChanged接口,并包含可供每个ViewModel使用的属性。

现在,虽然我可以从任何ViewModel访问并成功更新CommonDataStore属性,但问题是WPF框架只会通知当前视图中已更改的属性。因此,尽管已在其他ViewModel中更新了常用值,但其关联的视图不会更新。

我的应用程序的一个示例是登录屏幕:当用户登录时,我的LogInView会使用数据库中的新信息(即全名)进行更新,但MainView中的用户详细信息不会。

在阅读了其他一些帖子后,我也尝试将CommonDataStore类作为Singleton实现,但这没有用。我也可以将对这个公共数据对象的引用传递给MainViewModel中每个ViewModel的构造函数,但我不确定这是否是正确的方法。

我还发现在WPF中,static属性被视为有点像常量值。看起来他们只读了一次这个值。

所以无论如何,很明显,我的尝试都失败了。我想知道这样做的标准方法是什么?特别是,我需要能够绑定到公共属性,并在更改任何公共值时更新所有ViewModel和Views。任何帮助将不胜感激。非常感谢提前。

修改>>真?没有人在MVVM WPF应用程序中使用应用程序范围的变量?

我现在已经删除了Common属性声明的静态部分,只是将一个副本分别传递给每个ViewModel。这似乎有效,但我真的很想知道别人如何处理这种情况。请通过简单地告诉我如何组织这个应用程序范围的数据来回答。

2 个答案:

答案 0 :(得分:0)

您是否考虑过实施观察者模式?我们使用IObservableIObserver完成了此操作。 This描述了“IObservable / IObserver开发模型”,如下所示:

IObservable / IObserver开发模型提供了使用输入和输出适配器作为事件源和接收器的生产者和使用者的替代方法。此模型基于IObservable / IObserver设计模式,其中观察者是希望在另一个对象的状态发生更改时得到通知的任何对象,并且可观察对象是其状态可能感兴趣的任何对象,并且其中的另一个对象可能是注册兴趣。例如,在发布 - 订阅应用程序中,observable是发布者,观察者是订阅者对象。有关详细信息,请参阅在MSDN上探索Observer设计模式。

答案 1 :(得分:0)

我做了类似你上次描述的事情。我有一个名为SecurityContext的类,它包含一些应用程序范围的数据。应用程序启动时会创建一个实例,然后通过依赖注入将该实例传递到所有ViewModel的构造函数中。我有一个ViewModels的基类,它通过常规实例属性公开该对象(实现INotifyPropertyChanged)。