Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 跨ViewModels发布更新?_C#_Wpf_Mvvm - Fatal编程技术网

C# 跨ViewModels发布更新?

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组织的主页。每个选项卡项都有一个关联的视图和视图模型。在一个页面上,有一个数据网格,显示了所有的约会以及一些具体的细节,比如客户

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

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并连接到不同的视图,但关注同一个模型,它们都会得到更新