跨ViewModels发布更新?

时间:2012-01-25 03:32:29

标签: c# wpf mvvm

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

Employee
  +Name:string

Client
  +Name:string
  +PhoneNumber:string

Appointment
  +Employee:Employee
  +Client:Client
  +DateAndTime:DateTime

我的应用程序有一些使用TabControl组织的主页面。每个TabItem都有一个关联的View和ViewModel。在一个页面上,有一个DataGrid显示所有具有多个特定详细信息的约会,例如客户端的电话号码。一秒钟的页面,有另一个DataGrid显示所有客户端。这些DataGrids绑定到不同的ViewModel,因为它们位于不同的页面上。我的ViewModel实现为仅实现INotifyPropertyChange的Model的包装。

并且存在问题:如果用户在第二页上修改了客户端的电话号码,则该页面的ViewModel会正确更新(以及通过它的模型),但第一页的ViewModel不会通知发生了变化。当我回到第一页时,屏幕上任何与该客户端的约会仍会显示旧的电话号码,直到我做了一些会导致该ViewModel更新的内容。

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

为了使事情变得更复杂,我在第一页上使用日历控件并使用其SelectedDate属性来确定要显示的约会。因此,只要SelectedDate发生更改或添加或删除约会,该页面的ViewModel就必须保留自己更新的约会缓存列表。

感谢您提供任何帮助。

2 个答案:

答案 0 :(得分:0)

你可能想要某种消息传递,通知和听众等。有很多方法可以做,检查MVVM Light,它有一个内置的方法,这篇文章有一个使用它的例子。 ..

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

答案 1 :(得分:0)

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

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

确保ViewModel何时离开范围,取消其从模型中取消。

这样做的原因是因为您没有让模型直接知道ViewModel。你只是让模特大吼大叫“嘿嘿我改变了!”。然后任何人都可以在不违反任何模式的情况下采取适当的行动,并且由于允许ViewModel关注模型,因此可以解决这个问题。

如果订阅了五个不同的ViewModel并连接到不同的视图但注意到相同的模型,他们都将获得更新。