2012-02-16 62 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