2012-01-25 38 views
1

下面是模式,爲我的WPF應用程序的簡化版本:跨ViewModels發佈更新?

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的模型的簡單包裝。

還有一個問題:如果用戶在第二個頁面上修改客戶端的電話號碼,該頁面的ViewModel會正確更新(並通過它的Model),但不會通知第一頁的ViewModel發生了變化。當我回到第一頁時,屏幕上顯示的那個客戶端的任何約會仍然會顯示舊的電話號碼,直到我執行一些會導致該ViewModel更新的事件。

我應該如何解決這個問題?應該在頁面之間共享一個普通的ViewModel嗎?模型應該在改變時通知所有ViewModel(模型目前對ViewModel一無所知)?這是我第一個MVVM項目,所以我不知道應該怎麼做。

爲了使事情更加複雜,在我的第一頁上,我使用日曆控件並使用其SelectedDate屬性來確定要顯示的約會。因此,該頁面的ViewModel必須保留其自己的約會快照列表,當SelectedDate更改或約會被添加或刪除時,約會列表將被更新。

感謝您的任何幫助。

回答

0

模型不應該知道的視圖模型,就像視圖模型不應該知道的視圖。

如果您不能引入MVVM Light或其他框架,請在模型上放置一個事件(或讓它實現INotifyPropertyChanged),並且ViewModel可以訂閱該事件並引發它自己的PropertyChanged事件。

只要確保ViewModel何時離開其從模型退訂的範圍。

這個工作原因是因爲你沒有讓模型直接意識到ViewModel。你只是讓模特大喊「嘿,我變了!」。然後,任何人都可以在不違反任何模式的情況下采取適當的行動,並且由於ViewModel可以關注模型,因此可以解決這個問題。

如果五個不同的ViewModel訂閱並連接到不同的視圖,但注意到相同的模型,他們都會得到更新。