【问题标题】:How to handle bindable application wide variables in a WPF MVVM application?如何在 WPF MVVM 应用程序中处理可绑定的应用程序范围的变量?
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 感谢您的回复迈克。我很高兴得到一些反馈,表明我所做的并不违反任何 MVVM 原则。
【解决方案2】:

您是否考虑过实施观察者模式?我们已经通过IObservableIObserver 做到了这一点。 This对“IObservable/IObserver开发模型”的描述如下:

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

【讨论】:

  • 感谢您的回复。虽然很有趣,但我认为观察者模式并不是我所追求的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-27
  • 2014-10-11
  • 1970-01-01
  • 2011-05-18
  • 1970-01-01
相关资源
最近更新 更多