2009-08-12 76 views
1

我是相當新的MVVM,我有幾個問題:MVVM問題:模型的定義,包裝模型對象和模態對話框

是模型=業務層?

如果我有一個客戶模型,其中包含訂單列表和訂單,每個訂單都包含項目列表,那麼您如何將它在視圖中分開?目前,我的CustomerModel有一個CustomerViewModel。 CustomerViewModel包含OrderViewModel的列表。 OrderViewModel包含ItemsViewModel的列表。因此,如果我從數據層中檢索現有客戶,那麼我會根據現有列表創建合適的OrderViewModel和ItemViewModel。這是你通常如何實現mvvm?說實話,整個「重新包裝的對象」並不真的感覺正確。

我的customerview包含訂單和項目列表,每個訂單和項目都由其自己的用戶控件表示並重復使用ItemsControl。每個項目都有自己的添加,編輯和刪除按鈕。我想要有某種模式對話框禁用當前選項卡(而不是整個應用程序),而用戶呈現適當的形式。我找到的最簡單的解決方案是通過創建一個內容控件來創建一個控件dp(名爲Control),您可以設置它,並在isVisible = true時自動創建矩形疊加層。然後控制綁定到CustomerViewModel的dialogControl屬性....我沒有看到這是一個適當的mvvm解決方案,因爲我似乎混淆視圖與視圖模型。我認爲更正確的方法是在customerviewmodel中有一個視圖模型,它代表對話框中包含的視圖模型,併爲每個視圖模型中的視圖模型提供一個模板....但我似乎無法想出一種方法來實現矩形覆蓋此解決方案。

謝謝!

回答

0

我也一直在爭論這個想法。看起來你必須在Model和ViewModel之間重複自己。這樣做的主要原因是模型往往是一個傳統的對象,ViewModel實現INotifyPropertyChanged。對我來說,這是不同之處 - ViewModel支持雙向綁定。

一旦我想到這一點,那麼模型就成爲可選的。在我的情況下,模型通常是我帶入的一些庫代碼或生成的數據訪問層。或者換句話說,ViewModel包含了功能,Model是後備存儲。

我甚至停止調用我的ViewModel類xxxViewModel或xxxVM。現在他們只是xxx。但是,它們都是從IViewModel實現的,它本身只是從INotifyPropertyChanged繼承而來。

就用戶控件的使用而言,我只能使用DataTemplates來獲取視圖。對於選項卡,選項卡的ViewModel應啓動模式對話框,同時應在打開對話框時將Enabled屬性設置爲false。當它看到Enabled屬性爲false時,您的選項卡視圖應該禁用它自己。

+0

我同意你的定義以及ViewModel和Model之間的區別,但是你對在Model級別維護的屬性做什麼需要通過綁定來公開?模型層是否可以實現INotifyPropertyChanged,如果不是,您將如何獲得模型上的屬性以將視圖更改爲視圖? – ScottCher 2010-03-15 15:21:12

+0

@ScottCher:這確實是一個架構問題。沒有辦法自動將所有更改自動引發到一個普通的舊對象,直到包裝它的ViewModel,除非您定義事件來做到這一點。在我的情況下,我使用不可變的模型對象,所以我沒有這個問題。 ;) – 2010-03-21 17:56:24