2011-05-23 73 views
3

我正在研究利用我正在處理的UI項目(Silverlight/MVVM)上的事件聚合器模式來支持views/viewmodels之間的鬆散耦合。我們已經用一個簡單的事件系統編寫了幾個屏幕 - 這不過是這個概念的證明,但它似乎是創建一個鬆散耦合系統的非常優雅的解決方案。EventAggregator模式:如何傳遞數據?

我遇到的問題是當數據從一個ViewModel傳遞到另一個接收ViewModel尚未實例化。例如,如果「客戶列表」屏幕處於打開狀態,用戶可能會點擊特定客戶以打開編輯/查看客戶詳細信息屏幕(可能位於子窗口中)。客戶詳細信息屏幕需要客戶(或客戶ID)才能運行。

因此,OpenCustomerDetailEvent包含相關的客戶信息似乎是合理的,但將這些信息注入到Customer Detail V/VM中有哪些選擇?由於它在事件處理時尚未進入內存,因此它不能直接監聽事件(它本身不能作爲處理程序)。我們正在使用依賴注入容器來創建視圖和視圖模型(我們目前首先執行「視圖」),因此使用單獨的處理程序通過構造函數注入數據不是一個好的選擇。

在構建視圖(模型)後,將數據提取到視圖(模型)中有哪些其他選擇?一個採用強類型參數的init方法?使用setter來注入數據?讓處理程序創建V/VM,然後分派VM監聽的第二個事件?

+0

您是否使用特定的mvvm框架? – 2011-05-23 05:01:18

+0

我在猜測:「棱鏡」 – Maciek 2011-05-23 06:22:28

+0

這是一個家庭成長的框架。我認爲原始版本中的許多原理來自棱鏡(我不知道完整的歷史)。 – 2011-05-23 12:55:47

回答

2

爲此,我在我的silverlight應用程序中使用了Prism框架。它提供了EventAggregator模式和視圖導航基礎結構的實現。

在棱鏡的情況下,您將使用NavigationParameters,它爲view/viewmodel提供要使用和初始化的數據的信息。如果視圖/視圖模型尚未創建,則EventAggregator模式是無用的,因爲它尚未註冊到該事件。

如果你想依賴自己的框架,我會看看棱鏡框架view navigation是如何在那裏實現的,併爲你自己的框架選擇一些部分。

我個人鼓勵你使用棱鏡框架。

+0

您是否有描述NavigationParameters如何工作的源代碼鏈接? Google沒有提供任何有用的東西。 – 2011-05-23 13:51:50

+0

@Phil Sandler:我會盡快更新我的答案。只要章節是prism文檔是「在導航期間傳遞參數」 – Jehof 2011-05-23 14:03:35

+0

我意識到這是舊的,但是這裏是[Navigation Parameters](http://msdn.microsoft.com/en-us/library/gg430861。 ASPX#SEC10) – 2012-11-19 17:09:47