C# 跨ViewModels发布更新?
以下是我的WPF应用程序模型的简化版本:C# 跨ViewModels发布更新?,c#,wpf,mvvm,C#,Wpf,Mvvm,以下是我的WPF应用程序模型的简化版本: Employee +Name:string Client +Name:string +PhoneNumber:string Appointment +Employee:Employee +Client:Client +DateAndTime:DateTime 我的应用程序有几个用TabControl组织的主页。每个选项卡项都有一个关联的视图和视图模型。在一个页面上,有一个数据网格,显示了所有的约会以及一些具体的细节,比如客户
Employee
+Name:string
Client
+Name:string
+PhoneNumber:string
Appointment
+Employee:Employee
+Client:Client
+DateAndTime:DateTime
我的应用程序有几个用TabControl组织的主页。每个选项卡项都有一个关联的视图和视图模型。在一个页面上,有一个数据网格,显示了所有的约会以及一些具体的细节,比如客户的电话号码。一个是第二个页面,另一个DataGrid显示所有客户端。这些数据网格绑定到不同的ViewModel,因为它们位于不同的页面上。My ViewModels仅作为实现INotifyPropertyChange的模型的包装器实现
还有一个问题:如果用户在第二页上修改了客户的电话号码,该页的ViewModel将正确更新,模型将通过该页进行更新,但第一页的ViewModel不会收到发生更改的通知。当我返回到第一页时,屏幕上与该客户的任何约会都会显示旧电话号码,直到我做了一些会导致该ViewModel更新的事情
我应该如何解决这个问题?是否应在页面之间共享公共ViewModel?当模型当前对ViewModels一无所知时,模型是否应该以某种方式通知所有ViewModels?这是我的第一个MVVM项目,所以我不确定应该怎么做
为了让事情变得更复杂,在我的第一个页面上,我使用日历控件并使用其SelectedDate属性来确定要显示哪些约会。因此,该页面的ViewModel必须保留其自己的缓存约会列表,每当SelectedDate更改或添加或删除约会时,该列表都会更新
感谢您的帮助。您可能需要一些消息,通知和侦听器等。有很多方法可以做到这一点,请查看,它有一个内置的方法,这篇文章有一个使用它的示例
模型永远不应该知道ViewModel,就像ViewModel永远不应该知道视图一样 如果不能引入MVVM Light或其他框架,请在模型上放置一个事件或让它实现INotifyPropertyChanged,ViewModel可以订阅该事件并引发自己的PropertyChanged事件 只要确保ViewModel离开作用域时取消订阅模型即可 这样做之所以有效,是因为您没有使模型直接了解ViewModel。你只是让模特喊“嘿,伙计,我变了!”!。然后,任何倾听的人都可以在不违反任何模式的情况下采取适当的行动,因为ViewModels被允许关注模型,所以这是可行的 如果订阅了五个不同的ViewModel并连接到不同的视图,但关注同一个模型,它们都会得到更新