【发布时间】:2011-08-17 05:42:16
【问题描述】:
我正在使用 MVVM 模式编写一个相当大规模的 WPF 桌面应用程序。我一直在努力让我的公共属性在更新它的视图之外的视图中更新。
我有一个RibbonWindow MainView,其中包含一个ContentControl,它根据用户的选择一次显示一个剩余的视图。我有一个所有 ViewModel 都扩展的 BaseViewModel 类。除其他外,此类公开 INotifyPropertyChanged 接口并包含 CommonDataStore 类型的 static 属性。该类还实现了 INotifyPropertyChanged 接口并包含对每个 ViewModel 可用的属性。
现在,虽然我可以从任何 ViewModel 访问并成功更新 CommonDataStore 属性,但问题是 WPF 框架只会通知当前视图中已更改的属性。因此,尽管其他 ViewModel 中的公共值已更新,但它们关联的 View 不会更新。
我的应用程序中的一个示例是登录屏幕:当用户登录时,我的 LogInView 会使用数据库中的新信息(即全名)进行更新,但 MainView 中的用户详细信息不会。
在阅读了一些其他帖子后,我还尝试将 CommonDataStore 类实现为单例,但这并没有帮助。我也可以将这个公共数据对象的引用从MainViewModel 传递给每个 ViewModel 的构造函数,但我不确定这是否是正确的方法。
我还发现,在 WPF 中,static 属性被视为有点像常量值。他们似乎只读取了一次值。
所以无论如何,很明显,我的尝试都失败了。我想知道这样做的标准方法是什么?特别是,我需要能够绑定到公共属性,并在更改任何公共值时更新我的所有 ViewModel 和 View。任何帮助将不胜感激。非常感谢。
编辑>>真的吗?没有人在 MVVM WPF 应用程序中使用应用程序范围的变量?
我现在已经删除了 Common 属性声明的静态部分,只是将一个副本单独传递给每个 ViewModel。这似乎可行,但我真的很想知道其他人如何处理这种情况。请通过简单地告诉我您如何组织此应用程序范围的数据来回答。
【问题讨论】:
-
请贴一些代码...你是如何编写绑定的?
-
常规方式:
Text="{Binding Common.CurrentEmployee.Name}"。Common是 Base 类中的属性,'CurrentEmployee' 是CommonDataStore类中的属性。我不能发布我所有的相关代码——太多了。我问的是其他人如何实现这一点,而不是要求专门修复我的代码。 -
好的,但是 Common 在基类的所有实例之间共享吗?
-
只是出于好奇,您是否绑定了 Mode=TwoWay?您的模型对象是否实现了 INotify?或者只是你的虚拟机中的属性?
-
Common属性是static,所以是的,它在所有 ViewModel 之间共享。我的视图中不需要Two-Way绑定...登录使用调用LogInViewModel中的方法的Command。该方法将用户登录并从数据库中检索用户详细信息。它更新了 Common 对象,但只有LogInView更新了详细信息。CommonDataStore中的所有属性都调用INotifyPropertyChanged系统,但BaseViewModel中的Common属性不能,因为它是静态的。我还将它包装在一个调用 Notify 的非静态方法中......没有帮助。
标签: wpf variables mvvm desktop-application