2013-03-19 111 views
3

好的這裏有一點值得思考。將viewmodel與model結合使用

MVVM聲明Model與ViewModel不可知。所以ViewModel公開了View綁定的屬性。

微軟代碼分析規則告訴我將一個屬性添加到模型中的公共變量中。

警告:CA1051:Microsoft.Design:因爲現場「Employee.name」是 可見其聲明類型之外,它的可改變 私人和領域 有添加屬性,用相同的可訪問性目前,爲了提供訪問權限。

現在它的2個重複屬性,我寧願讓它幹,所以我想合併ViewModel和視圖。這裏還有一件事,Model是一個POCO,並且沒有INotifyPropertyChanged,所以讓VM知道Model值的變化是另一個問題。我使用了很多基於IList的綁定

我可能會忽略未來的問題嗎?

編輯:我忘了提及,我看着how to correctly define Model to ViewModel relation?,在我們的軟件中還有一件事是我們有一個單獨的實體,它填充了IList,它是一個SERVICE/UTILITY Assembly。 EmployeeViewModel在一個單獨的VIEW Assembly中。所以我無法返回ILIst。

回答

0

還有另一件事這裏,該模型是一個POCO,並且不會有任何INotifyPropertyChanged的,因此讓虛擬機知道在 模型值的變化是另一個問題

因爲(我假設)模型可以從任何地方改變,你唯一的選擇是擁有2個INPC - 一個用於Model-ViewModel,一個用於ViewModel-View。

我個人不喜歡這種方法。太多的流程和重構問題(除非你使用反射 - 這是更多的代碼和查找,但高度可維護) 只需嘗試物理分離模型和ViewModel分開使用部分類。例如Employee.cs和Employee.ViewModel.cs。和它們分組 - 看起來更細

模型需要是可移植的,INPC is fine與便攜式類庫,所以你可以重複使用在各種目標

2

不要這樣做。我知道這聽起來像很多額外的東西,你不需要,但它會讓你的應用程序變得更復雜。我發現將ViewModel綁定到支持屬性通知是絕對必要的,並讓我以視圖可以輕鬆使用的方式呈現數據,而不必綁定到模型中的表示 - ViewModel根據需要在兩者之間進行轉換。

如果你沒有這些層次,未來事物的變化,特別是一旦你通過一定的複雜度將變得非常困難。

現在,無論您聽取微軟關於在Model上使用公共屬性而非公共字段的建議,都取決於您,但如果您稍後需要將某些邏輯放入getter和setter,那麼這是一個很好的習慣。自動屬性首先可以很好地代替簡單的公共字段,在您實際需要之前,您不必聲明後臺字段。

+0

馬修,謝謝你的INotifyPropertyChanged的實現是很「代碼級特徵」的代碼! ViewModel的。具體到我的項目,底層模型的價值可能會改變。那麼我的ViewModel如何知道這個?我的模型實際上沒有ViewModel可以描述的INotifyPropertyChanged(如果它有一個PropertyChanged處理程序,它不只是一個Model ..它是一個ViewModel)。我覺得對於這個特定的需求教科書MVVM只是沒有發生 – 2013-03-19 09:17:24

+0

你可以將你的模型包裝在實現INPC的類中。然而,這意味着你有許多樣板代碼暴露每個屬性並觸發propertychanged – failedprogramming 2013-03-19 09:32:44

+0

通常的設計假設沒有其他任何東西會改變背後的模型。如果這是一種可能性,那麼該模型必須提供一種方式來表明發生了變化。有很多方法可以做到這一點,INPC只是其中之一,但它確實需要一些知道該模型實際上已經改變的事物的積極參與。 – 2013-03-19 10:30:54

相關問題