在ViewModels之间发布更新

本文关键字:更新 布更新 ViewModels 之间 | 更新日期: 2023-09-27 18:21:24

下面是我的WPF应用程序的模型的简化版本:

Employee
  +Name:string
Client
  +Name:string
  +PhoneNumber:string
Appointment
  +Employee:Employee
  +Client:Client
  +DateAndTime:DateTime

我的应用程序有几个用TabControl组织的主页。每个TabItem都有一个关联的View和ViewModel。在一个页面上,有一个DataGrid显示了所有约会,其中包含一些特定的细节,比如客户的电话号码。在第二页中,有另一个DataGrid显示所有客户端。这些DataGrids绑定到不同的ViewModel,因为它们位于不同的页面上。我的ViewModels只是实现INotifyPropertyChange的Model的包装器。

还有一个问题:如果用户在第二个页面上修改了客户端的电话号码,则该页面的ViewModel会正确更新(以及通过它更新的Model),但第一个页面的ViewModel不会被通知发生了更改。当我回到第一个页面时,屏幕上与该客户的任何约会都会显示旧的电话号码,直到我做了一些更新ViewModel的事情。

我应该如何解决这个问题?是否应该在页面之间共享通用ViewModel?当进行更改时,模型是否应该以某种方式通知所有ViewModels(模型当前对ViewModels一无所知)?这是我的第一个MVVM项目,所以我不确定应该怎么做。

为了使事情更加复杂,在我的第一个页面上,我使用了一个日历控件,并使用其SelectedDate属性来确定要显示哪些约会。因此,该页面的ViewModel必须保留自己缓存的约会列表,每当SelectedDate更改或添加或删除约会时,它都会更新这些列表。

谢谢你在这方面的帮助。

在ViewModels之间发布更新

你可能想要一些消息传递、通知和侦听等。有很多方法可以做到这一点,请查看MVVM Light,它有一个内置的方法,这篇文章有一个使用它的例子。。。

http://blog.galasoft.ch/archive/2009/10/18/clean-shutdown-in-silverlight-and-wpf-applications.aspx

模型不应该知道ViewModel,就像ViewModel不应该知道View一样。

如果不能引入MVVM Light或其他框架,请在模型上放置一个事件(或让它实现INotifyPropertyChanged),ViewModel可以订阅该事件并引发自己的PropertyChanged事件。

只要确保ViewModel在离开作用域时取消订阅模型即可。

这之所以有效,是因为您没有让模型直接了解ViewModel。你只是让模特大喊"嘿,我变了!"。然后,任何收听的人都可以在不违反任何模式的情况下采取适当的行动,并且由于ViewModels被允许关注Models,所以这是可行的。

如果订阅了五个不同的ViewModel,并连接到不同的视图,但关注同一个模型,它们都会得到更新。