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

时间:2011-08-10 10:42:04

标签: wpf mvvm navigation viewmodel prism

使用Prism几周后,我经历过各种导航方法。但是仍然有一件事我无法通过Prism“开箱即用”实现:导航到视图模型实例。导航到视图模型或视图类型非常简单,但实际上无法导航到真实的视图模型实例

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

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

我真的觉得我在建筑中遗漏了一些东西,因为这种做法对我来说显而易见,但显然我找不到任何有同样关注的人。

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

2 个答案:

答案 0 :(得分:5)

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

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

regionTarget.ItemsSource = region.Views;

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

当然,感谢您的帮助Rachel: - )

答案 1 :(得分:2)

看看我在使用MVVM导航时写的this article

您的应用程序shell需要ViewModel,以定义ViewModelCurrentPage。要更改ViewModel,您只需触发一个shell,它将选择一个事件来将CurrentPage设置为ViewModel应该是最新的。

您可以使用PRISM切换具有类似内容的页面:

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

我确定还有其他方法可以实现这一目标,但到目前为止,我发现这种方式最简单