2013-08-28 68 views
7

我已經閱讀了將模型數據中的更改傳達給視圖模型的各種方法。 有些人建議模型應儘可能實現INotifyPropertyChanged,以便它可以通知視圖模型中已更改的屬性。有些人建議在模型和視圖模型之間建立一個服務層,服務層實現INPC,方法調用通過這個服務層路由到模型,以便服務層通知視圖模型。WPF MVVM:INPC和調解視圖模型和模型之間的通信

我認爲後者是前者的更細粒度的修訂,並已開始在我的模型類中實現INPC。這感覺不對,因爲

a)我現在必須在我的視圖模型中編寫事件處理程序,以獲取來自模型的通知。 這採用長開關(propertyName)的形式,它在視圖模型上設置相應的屬性,使NPC再次向上發送。我覺得我在這裏寫了很多的鍋爐板代碼。

b)視圖模型現在通過一堆只依照慣例調整的字符串(即沒有定義「接口」)耦合到我的模型。更不用說這會導致IDE的困難。

c)我的模型必須修改以適應這種情況!如果由於某種原因關閉了會怎樣?我認爲這樣的模式是爲了提高代碼的可重用性而設計的。不僅如此,啓動INPC事件所需的代碼是單調乏味且重複的,並且不是真正可抽象的。

我真的很想知道WPF專業人員是如何通過依賴屬性等來解決這個問題的。我感覺我錯過了一些東西。我不喜歡使用框架,因爲他們想從頭開始學習。 我已經離開WPF一兩年了,最近和AngularJS合作讓我質疑我的方法。

謝謝!

+0

當你說'模型'時,你指的是什麼?您是指業務對象/數據類型類,與數據源連接的代碼,還是兩者? – Sheridan

+0

我指的是業務數據和功能。 在這種情況下,我的模型類是使用VM「TestViewModel」「TestPlanViewModel」的「Test」(屬性如「Description」,「Result」,方法如「Run」)和「TestPlan」。 –

+0

您的模型不需要INPC,只需要您的視圖模型。這就是你的虛擬機的全部內容 - 我看到有人把INPC放在他們的模型中,但它讓我覺得它只是一個視圖模型,而不是一個模型。 –

回答

5

出於此答案的目的,我將調用業務對象類的數據類型。

在我個人的經驗,視圖模型是總是綁的數據類型。您必須具有要顯示的類型的屬性,因此總是會有一個從視圖模型名稱空間到數據類型名稱空間的引用。

你稱爲模型(從你的評論中的描述)聽起來就像我的視圖模型。我的視圖模型具有屬性,主要是各種數據類型類和方法的類型,而我的數據類型類只是大部分屬性......它們只是數據的持有者和變化的記錄者。

你似乎覺得INotifyPropertyChanged界面在你稱之爲'模型'和視圖模型類之間執行一些職責...在我看來,這是可選的最好...從INotifyPropertyChanged Interface MSDN上的頁面:

INotifyPropertyChanged接口用於通知客戶端(通常爲綁定客戶端)屬性值已更改。

所以,我看到了INotifyPropertyChanged接口作爲是「生命線」的意見和視圖模型和數據對象之間去。一些開發人員更喜歡在自己的視圖模型中「包裝」每種數據類型,但我更願意直接在我的數據類型中實現接口。

我這樣做的主要原因是我可以在自定義集合類中掛鉤到這個框架中。這使我可以擁有知道集合中的任何項目中的任何屬性發生的任何更改的集合。它還使我能夠將數據同步建立到我的基類中,以便對象知道什麼時候有任何更改。

它還爲每個數據類型類創建匹配視圖模型類節省了時間。爲什麼有兩個班級要做什麼?我從來不需要這種分離的程度。如果我正確地理解了你,在你的數據類型類中實現這個接口將否定執行你的觀點a)的必要性。

你的一些點B)和C)可以也將成爲無效的,如果你可以使用.NET 4.5的有一個新的CallerMemberNameAttribute屬性,你可以用它來自動進給每個屬性的名稱爲PropertyChanged處理器。我發現了一篇名爲C# 5–Making INotifyPropertyChanged Easier的好文章,並對其進行了很好的描述。

我已經寫了幾個大規模的WPF應用程序,現在和幾個框架,我從來沒有遇到過在我的數據類型類中實現接口INotifyPropertyChanged的問題。事實上,如果我必須爲每個數據類型類實現包裝視圖模型類,我不認爲我可以在同一時間寫入它們。迄今爲止,這種方法已經很好地發揮了作用,並且我計劃繼續使用它,直到我找到更好的方法。然而,這僅僅是一個開發者的意見,你必須選擇適合自己的東西。

+0

很好的答案,感謝您花時間寫下來。 我是否正確地解釋你說你的視圖模型公開你的模型類的實例(又稱數據類型本身是通告器),而不是單獨的視圖模型代理每個屬性? 我對MVVM的理解是模擬屏幕上顯示的數據。你可以在每個模型類/數據類型或每個VIEW基礎上做到這一點,我認爲後者符合你的建議? –