以下是我的WPF应用程序的模型的简化版本:
Employee
+Name:string
Client
+Name:string
+PhoneNumber:string
Appointment
+Employee:Employee
+Client:Client
+DateAndTime:DateTime
我的应用程序有几个用TabControl组织的主页。每个TabItem都有一个关联的视图和ViewModel。在一个页面上,有一个显示所有约会的DataGrid,其中包含几个特定的详细信息,比如客户的电话号码。每隔一页,就会有另一个DataGrid显示所有客户端。这些DataGrids绑定到不同的ViewModels,因为它们在不同的页面上。我的ViewModels仅仅作为实现INotifyPropertyChange的模型的包装器来实现。
还有一个问题:如果用户在第二个页面上修改了客户的电话号码,那么该页面的ViewModel就会正确地更新(并通过它更新模型),但是第一个页面的ViewModel不会被通知发生了更改。当我返回到第一页时,屏幕上显示的与该客户的任何约会仍然显示旧的电话号码,直到我执行了导致该ViewModel更新的操作。
我该如何解决这个问题?是否应该在页面之间共享公共ViewModel?模型是否应该在发生更改时以某种方式通知所有ViewModels (模型当前对ViewModels一无所知)?这是我的第一个MVVM项目,所以我不知道该怎么做。
更复杂的是,在我的第一个页面上,我使用了一个日历控件,并使用它的SelectedDate属性来确定要显示哪些约会。因此,该页面的ViewModel必须保留自己的缓存约会列表,每当SelectedDate更改或添加或删除约会时,它都会更新该列表。
谢谢你在这方面的帮助。
发布于 2012-01-25 03:53:54
你可能想要一些消息,通知和监听器等等。有很多方法可以做到这一点,看看MVVM Light,它有一个内置的方法,这篇文章有一个使用的例子……
http://blog.galasoft.ch/archive/2009/10/18/clean-shutdown-in-silverlight-and-wpf-applications.aspx
发布于 2012-01-25 06:03:18
模型永远不应该知道ViewModel,就像ViewModel永远不应该知道视图一样。
如果您不能引入MVVM Light或其他框架,那么可以在模型上放置一个事件(或者让它实现INotifyPropertyChanged),然后ViewModel可以订阅该事件并引发它自己的PropertyChanged事件。
只需确保当ViewModel离开作用域时,它会取消订阅模型。
这样做的原因是因为您没有让模型直接意识到ViewModel。您只是允许Model大喊“嘿,伙计,我改变了!”。然后,任何监听的人都可以在不违反任何模式的情况下采取适当的行动,而且由于ViewModels被允许关注模型,所以这是可行的。
如果五个不同的ViewModels被订阅并连接到不同的视图,但是关注相同的模型,那么它们都会得到更新。
https://stackoverflow.com/questions/8997508
复制