在使用Prism几周后,我已经尝试了各种导航方法。但是仍然有一件事是我无法用Prism"开箱即用"实现的:导航到视图模型实例。导航到视图模型或视图类型非常容易,但实际上没有办法导航到真正的视图模型实例。
例如,当我有一个不同视图模型实例(不同类型)的列表时,如果选择了一个,并且我想在我的内容区域中显示它,我无法实现它,除非我通过事件聚合发布更改,我不希望这样做,因为这会让我在我的内容区域中坚持一种视图。我想做的是注册一个视图模型实例到一个区域,这样视图就可以从数据模板动态加载。
实际上,我通过创建RegisterViewModelWithRegion作为RegionManager的扩展方法来实现这一点,它工作得很好,但它不是很整洁,因为我必须手动查找我的应用程序资源,加载视图,附加我的视图模型实例,然后将视图添加到我的区域。
我真的觉得我在建筑中错过了一些东西,因为这种实践对我来说是显而易见的,但显然我找不到任何人有同样的关注。
您的帮助和经验将不胜感激。谢谢。经过与Prism团队的讨论,我发现实际上,使用Region.Add(object view)
方法在一个区域中注入视图模型是完全可以的。它将给出完全相同的结果(除了一些小情况)。
我检查了ItemsControlRegionAdapter,它最后所做的就是
regionTarget.ItemsSource = region.Views;
regionTarget
是目标控件(例如ListBox), region.Views
属性是您注入区域的对象。
看看我写的关于在MVVM中使用导航的文章
您的应用程序shell需要一个ViewModel
,它定义哪个ViewModel
是CurrentPage
。要更改ViewModel,只需触发一个事件,shell将拾取该事件以将CurrentPage
设置为当前的ViewModel。
你可以像这样用PRISM切换页面:
eventAggregator.GetEvent<ChangePageEvent>()
.Publish(new ChangePageEventArgs(this));
我相信还有其他方法可以做到这一点,但到目前为止,我发现这种方法是最简单的