簡體   English   中英

WPF MVVM:INPC和中介視圖模型和模型之間的通信

[英]WPF MVVM: INPC and mediating communication between view model & model

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

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

a)我現在必須在視圖模型中編寫一個事件處理程序,用於模型中的通知。 這采用長開關(propertyName)的形式,它在視圖模型上設置相應的屬性,導致NPC再次向上發送。 我覺得我在這里寫了很多鍋爐板代碼。

b)視圖模型現在通過一串字符串耦合到我的模型,這些字符串僅由約定規定,即沒有定義“接口”。 更不用說這會導致IDE的困難。

c)我的模型必須進行修改以適應這種情況! 如果由於某種原因被關閉怎么辦? 我認為這樣的模式旨在增加代碼的可重用性和關注點的分離。 不僅如此,而且觸發INPC事件所需的代碼是繁瑣且重復的,並且不是真正可抽象的。

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

謝謝!

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

根據我的個人經驗,視圖模型始終與數據類型相關聯。 您必須具有要顯示的類型的屬性,因此始終會存在從視圖模型命名空間到數據類型命名空間的引用。

您所謂的模型(根據您的評論中的描述)聽起來像我的視圖模型。 我的視圖模型具有屬性,主要是各種數據類型類和方法的類型,而我的數據類型類只占用大部分屬性......它們只是數據的持有者和變更的記者。

您似乎認為INotifyPropertyChanged接口在您調用它時的'model'和視圖模型類之間執行某些任務...在我看來,這在MSDN的INotifyPropertyChanged接口頁面中是可選的... :

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

因此,我將INotifyPropertyChanged接口視為視圖與視圖模型和數據對象之間的“生命之血”。 一些開發人員更喜歡在自己的視圖模型中“包裝”每種數據類型,但我更喜歡直接在我的數據類型中實現INotifyPropertyChanged接口。

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

它還節省了為每個數據類型類創建匹配的視圖模型類的時間。 為什么有兩個班級可以做什么? 我從來不需要那種程度的分離。 如果我理解正確,在數據類型類中實現此接口將無需執行您的觀點a)。

你的一些點b)和c)也可以被視為無效,如果你可以使用.NET 4.5的有一個新的CallerMemberNameAttribute ,你可以用它來自動進給每個屬性的名稱屬性PropertyChanged處理程序。 我找到了一篇很好的文章,名為C#5-Making INotifyPropertyChanged ,對它有一個很好的描述。

我現在已經編寫了幾個大規模的WPF應用程序和一些框架,我在數據類型類中實現INotifyPropertyChanged接口時從未遇到過問題。 事實上,如果我必須為每個數據類型類實現包裝器視圖模型類,我認為我不能在同一時間編寫它們。 到目前為止,這種方法對我很有用,我打算堅持下去,直到我找到一個更好的方法。 然而,這只是一個開發人員的意見,你必須采取適合你的方式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM