2010-05-06 61 views
0

那麼如何顯示複雜的聚合視圖模型其模型之間有相互關係?MVVM - 工作區中的幾個工作區似乎沒有意義

NO WPF弟子曾經談到的是,猜測爲什麼它不可能...

你認爲那是真的嗎?

不理解我?

看:一個CustomerViewModel有許多OrderViewModel和一顆顆ProductViewModel

你有3工作區進入新的數據對所有3的ViewModels,你有3列表框/ combobo /數據網格以多選類型=> customerVM s, orderVM S和productVM`s的集合。

每當添加新的客戶/訂單/產品時,用戶界面對用戶而言都不需要關閉/打開工作空間,對於用戶而言,這種典型的LOB應用程序要求如何實現?

編輯:

你有MVVM型工作空間的集合。 每個ViewModel都可以是一個Workspace,因爲它來自WorkSpace類。 工作區集合綁定到ItemsSource afair josh smith示例。

聲明:我想用古爾德成熟的Windows窗體的用戶界面沒有關閉的的ViewModels ... 問題:MVVM只能與工作空間(可關閉的並不重要...)工作,因爲一個CustomerviewModel必須已經被實例化然後根據數據類型添加到綁定到itemsControl和datatemplated的工作空間集合中。

如果我沒有保存我的ViewModel實例的工作空間,我無法對它們進行數據定義,因爲MVVM中的ViewModel將模型作爲構造函數參數。使用CustomerViewModel的DataType DataTemplating UserControl將在XAML中引發異常!

現在看我的UI我想有:我沒有工作區,但3周的ViewModels = 3個用戶控件datatemplated手段3次大爆炸......

現在你知道爲什麼我不喜歡MVVM?它不是很好的想法,我尋找一個解決方案...

當然,我可以把我的ViewModels又名DataFormulars在一個ObservableCollection,但我不希望他們綁定到一個ItemsControl。我希望這3個UserControl在我的佈局中有一定的位置。與ItemsControl你有一個愚蠢的隊列,新的Dataformular只是添加和包裝,如果它不適合現有的空間。那是所有垃圾佈局設計/壞UI。

你現在得到我嗎?

回答

2

您可以輕鬆地在一個窗口中有多個控件,每個控件綁定到不同的ViewModel。爲了在VM之間進行協調,典型的方法是使用消息傳遞鬆散地將不同的組件耦合在一起。例如,您的Customer ViewModel可能會發送一條消息,說您選擇了一個訂單,然後您的OrderViewModel(可能在您的主窗口的一部分中可視化爲控件)將看到該消息並更改顯示的訂單。

您可以使用共享服務類來完成類似的操作,該服務類將公開您注入每個虛擬機的接口。然後,您可以綁定此共享接口的屬性以允許虛擬機進行通信,這與消息的方式大致相同。我已經使用類似於此的代表「SelectedObject」概念,其中可以選擇各種不同的對象類型,並且我的應用中的不同VM可能會以不同的方式顯示它們。例如,使用您的示例,如果某個產品成爲SelectedObject,則可能有一個「詳細信息」面板,該面板現在使用某個標準ProductDataTemplate呈現產品,並可能顯示另一個面板(顯示訂單)將更改產品列表上的SelectedItem。您可以輕鬆擁有多個「工作區」,並且所有這些工作區都依靠虛擬機用於協作的一組屬性或消息與海誓山盟保持同步。

+0

當然,一個窗口可以有幾個控件與視圖模型的數據類型一起數據化。那不是我說的。 我的產品/客戶/訂單的主要細節 - -ViewModelcollection工作正常,沒有使用消息系統排序的解決方法。只需在您的VM集合上使用IsSynchronizedTocurrentItem並綁定到它們,一切正常。 更多關於編輯見上文。 – msfanboy 2010-05-07 21:39:27

+0

你知道嗎,我想我是部分錯誤的。今天我檢查了Chinch,這是Sacha Barber的mvvm框架,它突然睜開了我的眼睛。 他不在他的CustomerViewModel中使用構造函數。我知道爲什麼;-) 他加載相關的訂單和產品LAZILY。 我這樣做EAGERLY綁定到我的組合框綁定到AllCustomersViewModel。 問題在於懶惰/渴望加載相關數據。 您的權利如果我使用延遲加載Dan我通過Messenger將選定的CustomerViewModel激發到另一個地方,例如在DataGrid中顯示相關的OrderViewModels。 – msfanboy 2010-05-08 18:50:29

+0

我看到你寫作解決方案的第一段,因爲你告訴我在Chinch中看到的是什麼,看起來我改變了我的加載策略,所以我可以踢ViewMOdels構造函數hurrraaayy XD – msfanboy 2010-05-08 18:56:40