2012-02-16 44 views
1

目前我正在學習棱鏡。我正在構建測試應用程序,我需要在點擊按鈕時將視圖注入區域。我知道如何使用這個代碼在視圖模型在棱鏡4中查看注入並避免依賴

IRegion region = _regionManager.Regions[RegionNames.TicketEditorRegion]; 
TicketEditorView view = _componentContainer.Resolve<TicketEditorView>(); 
region.Add(view); 

問題是我需要在模塊之間添加引用。我認爲這是不可取的事情。 我可以通過爲一些RegionBuilderThing添加接口並在統一視圖模型內解析它來避免這種情況。

所以這是一個很好的方法,如果是這樣,如何命名這個RegionBuilderThing(遵循一些設計模式/指導或其他人可以理解的東西)? 如果這不是一個好方法,那是什麼?

+0

你肯定要添加引用* somewhere *。即使你有一個'ITicketEditorView',你需要指示容器它應該把它解析到具體的'TicketEditorView'。那時你需要參考。 – Jon 2012-02-16 14:02:08

+0

是的,但爲此我有所有模塊都可以參考的基礎結構項目(它用於常見類型)。 – mersadk 2012-02-16 14:04:56

回答

0

在包含您要注入的ViewModel的外部模塊中,創建一個訂閱特定EventAggregator事件(稱爲InjectChildEvent)並將其作爲單例加載到ComponentContainer中的類。 InjectChildEvent可能會將RegionName作爲參數。在訂閱方法中,解析ViewModel並將其注入到Region中。

在主模塊中,單擊按鈕時,發佈InjectChildEvent EventAggregator事件的實例。

這樣你就可以避免引用另一個模塊。您需要在您的Infrastructure項目中創建EventAggregator事件。

+0

我發現這在mvvm/prism應用程序中被稱爲Controller。有關它的更多信息可以在這裏找到http://www.developmentalmadness.com/archive/2009/10/15/mvvm-with-prism-101-ndash-part-3b-view-injection-and.aspx – mersadk 2012-02-17 12:04:14

1

理想情況下,您需要注入一個ViewModel注入IRegion的Views集合,而不是View。假如你在一個被加載的ResourceDictionary中有一個DataTemplate(App.xaml和任何一個一樣好),ViewModel將被渲染爲適當的View。通過這種方式,您可以將ViewModel代碼完全分離出來,無論您使用何種View均可用於在屏幕上顯示ViewModel代碼。

<DataTemplate DataType="{x:Type viewmodels:MyViewModel}"> 
    <views:MyView /> 
</DataTemplate> 

除此之外,我不認爲你需要這樣的RegionBuilder。

+0

好的,但仍然需要引用模塊項目中的視圖模型(參考我試圖避免)。 – mersadk 2012-02-16 14:07:14

+0

好的,如果你確實避免引用其他模塊,我已經添加了另一個答案。 – 2012-02-17 10:43:51