使用Prism导航将数据返回到以前的ViewModel

时间:2014-12-01 22:12:57

标签: c# wpf mvvm prism

想象一下,您有两个视图,ViewModel InfoViewModel显示有关人的信息,ViewModel SearchViewModel处理搜索人并选择结果。

我希望InfoViewModel能够启动搜索过程,最终会导致SearchViewModel告诉ViewViewModel已经选择了某人。另一个潜在的要求是InfoViewModel可以与SearchViewModel通信,说这个结果是不可接受的,并且用户应该选择其他人(这应该在没有搜索结果屏幕消失并重新出现的情况下发生)

通常,InfoViewModel很容易解决这个问题,为SearchViewModel提供一个回调,只要选择了结果就会调用它。回调函数还可以有一个返回参数,指定结果是否良好,以便SearchViewModel可以自行清理。然而,几乎看起来Prism不鼓励这样做,因为至少在prism 4.0中,没有很好的方法可以将对象作为参数导航(你只能将字符串作为参数传递)。我正在使用的一个解决方法是使用服务来存储对象参数,然后可以通过字符串guid在下一个视图中唯一地标识这些参数。这有它自己的问题,但更糟糕的是,感觉像Prism故意设计反对这样做。

另一种方式似乎是在选择某人时使用IEventAggregator来广播事件。我必须根据唯一的ID过滤每个事件,以确保我收到的事件是给我的(如果由于某种原因,有两个搜索过程正在进行)。感觉就像这种方式只是试图模仿直接回调,但是以迂​​回的方式。

有谁知道这方面有一个很好的解决方案?如果答案是Prism 4.0没有解决这个问题的好方法,你必须使用Prism 5.0(因为它支持传递对象参数),那也没关系。我只是想知道其他想法是什么

1 个答案:

答案 0 :(得分:1)

可能只有一个"对"回答,有不同的方法。

您可以使用Prism5中的NavigationParameters类导航到视图传递详细信息。如果您仅限于Prism4,则可以将参数放在RegionContext中,然后使用OnNavigatedTo界面的INavigationAware方法访问它们。

关于"返回"结果,可能取决于应用程序的布局。如果允许多个视图,则通过事件代理注册然后使用事件是在不同组件之间进行通信的推荐方法。如果您只有一个视图,并且您认为事件代理是不必要的并且可能过度,请考虑使用与SearchViewModel配对的服务来存储结果(与您似乎已经执行的操作不同)。任何其他ViewModel都可以注入服务,因此他们将能够访问SearchViewModel设置的任何属性详细信息。

如果在父视图中逻辑限制搜索,请考虑使用InteractionRequest弹出搜索视图。