2009-12-22 48 views
8

假設我有一個名爲Customer的類。現在我需要呈現客戶。所以我創建了CustomerViewModel用於綁定。我正在尋找創建CustomerViewModel課程的最佳途徑。以下是我對創建它的想法。在MVVM中創建ViewModel的最佳方法

1 - 在視圖模型上再次創建客戶中的所有屬性。將客戶實例注入視圖模型,並且每個屬性都會重新映射此客戶對象的值。這種方法的好處是我可以爲所有的視圖模型創建一個通用的基類,並且在那裏有共同的功能。缺點將是在視圖模型上再次創建所有屬性並進行維護所需的時間。

2 - 從客戶派生視圖模型。所以我擁有所有視圖模型中的客戶的功能。但是這不會允許我使用一個通用的基類,並將常見的視圖模型邏輯放在那裏。

所以我想知道什麼是最好的方法來創建視圖模型?有沒有比我想象的更好的替代方法?

+0

需要多長時間才能在ViewModel中重複模型屬性?能夠放入一些轉換器或觸發器用於顯示目的,這使得我值得額外的分鐘。如果您有許多控件的複雜視圖,請將模型作爲視圖模型中的屬性添加,並在視圖中綁定到Model.Property。 – adrianm 2009-12-22 07:20:57

+2

我會避開#2。我不認爲你總是會找到一個明確的模型類和ViewModel之間的映射。爲了可維護性,我將與其他一些可能在邏輯上位於Custom模型前面的類一起使用,但也可能將其他模型類型在將來展示給視圖。 – 2009-12-28 17:29:26

回答

5

您應該考慮在MVVM上閱讀Josh Smith's article

他也有一個叫做MVVM Foundation的框架,它有一個ViewModel基類。總的來說,我認爲他實現ViewModel的方式是最好的。

+0

我已經看到了。他正在採用我在第1點中描述的方法。 – 2009-12-22 06:28:19

+0

是的......我認爲這是最好的方法。我從事過一個有100多個ViewModel的項目,這是最好的方法,也是最容易維護的。 希望能幫到你 – 2009-12-22 06:32:00

0

如果您原來的Customer類不支持數據綁定,那麼您將被迫創建一個viewmodel類並複製Customer類的屬性。

但是,如果您的客戶類已經實現了對數據綁定的支持(它具有依賴屬性或者實現INotifyPropertyChanged),那麼沒有根本原因不能直接綁定客戶類的屬性。

您當然可能有其他考慮因素 - 您可能希望讓viewmodel針對屬性更改執行某些操作,或者您可能不希望直接修改Customer對象。在這種情況下,您仍然需要包裝Customer類。

另外,您可能希望通過IDataErrorInfo接口支持數據驗證,在這種情況下,如果您的客戶類沒有實現此接口,您也可能需要將其包裝。

5

選項1好得多。原因是你希望能夠獨立地改變這兩層。在你的領域模型和視圖模型之間有一個緊密的耦合將在你想要避免的開發過程中引入剛性。

我處理不得不編寫這麼多代碼的方式是我不知道。我使用T4 templates,一些合理的約定(默認情況下,屬性在視圖模型中顯示;域模型類實現INotifyPropertyChanged,這些屬性向上委託)以及配置文件來處理投影/拼合並生成視圖模型。我還將它們作爲部分類生成,以便能夠根據需要向其中添加其他代碼。