2008-10-22 102 views
3

我正在使用WPF應用程序並使用Model-View-ViewModel模式。WPF中不使用棱鏡的鬆散耦合事件

應用程序由目前兩個模塊:

  • 左側面板瀏覽樹並選擇節點
  • 主面板顯示所選樹節點的內容。

我想保持這兩個模塊分離,但是當我在左面板中選擇一個節點時,我需要觸發主面板可以訂閱的事件。我不想結合Left和Main面板,所以我不想共享ViewModel類的實例。

最好我喜歡使用Prism(WPF複合應用程序指導),但我目前正在擴展現有的應用程序,並且不能引入更多的依賴關係。該項目也在.NET 3.0(不是3.5)上,所以我必須將Prism轉換回.NET 3.0,因爲它是爲.NET 3.5編寫的。

在棱鏡我會解決這個使用鬆散耦合事件基礎設施。它可以讓你在任何層次的任何課堂中觸發一個事件,並聽取任何層次上的任何課堂中的任何事件。基本上,事件的發佈者和訂閱者是分離的。

我使用Commands來實現View和ViewModel之間的鬆散耦合,但我不確定如何進行適當的跨視圖通信。

任何提示或建議,非常感謝。

我專門找了真正光權衡的pub/sub事件模型的.NET 2.0/3.0(無LINQ的東西),或者一些別的東西來實現跨瀏覽(模塊)的通信,而這兩個連接模塊。

更新:我最終以類似Glen的建議解決了這個問題。我有一個單獨的EventService(我稱之爲CommandProxy),並通過我的服務定位器中的構造函數(此刻我使用服務定位器而不是IoC容器)將其傳遞給每個ViewModel。 CommandProxy公開了一組MultiDelegateCommants,它是Prism中的DelegateCommand的擴展(Composite WPF Guidance)。它基本上允許與Visual Tree分離的命令,並支持多個訂閱者。

回答

7

你有IoC容器嗎?一種簡單的方法是創建一個自定義服務來觸發事件。事件聚合器是通用的,但你可以創建一個特定的服務來做你想做的事情。

例如創建一個具有OnNodeSelected方法的EventingService。該方法觸發掛起服務的NodeSelected事件。然後該服務在您的IoC容器中註冊,允許發佈者和訂閱者訪問它。這樣,如果說您的MainPanel需要訂閱,那麼您的MainPanelViewModel將在其構造函數中注入EventingServiec。它會再訂閱。如果您使用WPF,另一種方法是從Composite App Library代碼中提取CompositeCommand,並讓Eventing服務公開CompositeCommand。然後每個訂閱者(View Model)向服務註冊他們的命令。當調用OnNodeSelected時,將調用CompositeCommand的execute,從而通知所有相關方。

我們在通信主題中關於鬆散耦合事件的部分中,在www.microsoft.com/compositewpf的文檔中討論瞭如何使用您自己的服務進行復合應用指導。 (http://msdn.microsoft.com/en-us/library/cc707836.aspx)。 Francis Cheung也有這個帖子。