Prism:如何在区域中注入视图模型实例?

Posted

技术标签:

【中文标题】Prism:如何在区域中注入视图模型实例?【英文标题】:Prism: How to inject a view-model instance in a region? 【发布时间】:2011-10-23 23:35:39 【问题描述】:

在使用 Prism 数周后,我经历了各种导航方法。但仍有一件事是我无法使用 Prism“开箱即用”实现的:导航到视图模型实例。导航到视图模型或视图 type 非常容易,但实际上无法导航到真正的视图模型 instance

例如,当我有一个不同视图模型实例(也不同类型)的列表时,如果选择了一个并且我想在我的内容区域中显示它,我无法实现它,除非我通过事件聚合发布更改并且我不希望这样,因为这让我陷入了我的内容区域中的一种观点。我要做的是将视图模型实例注册到区域中,以便视图可以从数据模板动态加载。

实际上,我通过创建一个 RegisterViewModelWithRegion 作为 RegionManager 的扩展方法来实现这一点,它工作得很好,但它不是很整洁,因为我必须手动查找我的应用程序资源,加载视图,附加我的视图模型实例然后将视图添加到我的区域。

我真的觉得我在架构中遗漏了一些东西,因为这种做法对我来说似乎很明显,但显然我找不到任何人有同样的担忧。

非常感谢您的帮助和经验。 谢谢。

【问题讨论】:

【参考方案1】:

在与 Prism 团队讨论后,我发现实际上,使用Region.Add(object view) 方法在区域中注入视图模型是完全可以的。它会给出完全相同的结果(除了一些小情况)。

我检查了 ItemsControlRegionAdapter,它最终所做的只是

regionTarget.ItemsSource = region.Views;

regionTarget 是目标控件(例如 ListBox),region.Views 属性是您注入区域的对象。

当然,谢谢你的帮助,瑞秋 :-)

【讨论】:

我正在寻找同样的东西,但是如果通过Region.Add(viewModelInstance) 注入,ViewModel 如何指示区域显示特定视图?【参考方案2】:

看看我写的this article 使用 Navigation with MVVM

您的应用程序 shell 需要一个 ViewModel,它定义了哪个 ViewModelCurrentPage。要更改 ViewModel,您只需触发一个事件,shell 将接收该事件以将 CurrentPage 设置为应为当前的任何 ViewModel。

您可以使用 PRISM 像这样切换页面:

eventAggregator.GetEvent<ChangePageEvent>()
    .Publish(new ChangePageEventArgs(this));

我敢肯定还有其他方法可以做到这一点,但到目前为止我发现这种方法最简单

【讨论】:

实际上,在我的公司,在迁移到 Prism 之前,我们拥有自己的 MVVM 框架,并且 Shell 视图模型还控制工作区导航。现在我们使用 Prism,因为它已经提供了工作区导航 (RegionManager) 的概念,我们正在尝试完全集成 Prism 功能,从而摆脱手动工作区管理。 @UCodia PRISM 的RegionManager 是一个不错的概念,但我不经常使用它,因为我不喜欢与它相关的一些限制。我建议不要将其用作您唯一的导航方法。

以上是关于Prism:如何在区域中注入视图模型实例?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Prism 在 Xamarin Forms 的后台服务中实现依赖注入

如何使用 PRISM 获取区域中的当前活动视图?

如何在 Xamarin 表单中的视图模型之间最好地传递信息 - Prism [关闭]

如何在 Prism 中为我的对话窗口设置区域管理器?

在 PRISM 4 中导航到新视图时如何传递对象

如何将依赖项注入 iOS 视图控制器?