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
,它定义了哪个 ViewModel
是 CurrentPage
。要更改 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 的后台服务中实现依赖注入