PRISM:使用PopupRegions将对象/事件从父级传递到子视图/ VM

时间:2012-01-18 19:05:18

标签: events mvvm prism

我们正在使用一个使用棱镜和MVVM进行医疗保健跟踪操作的应用程序。

在此应用程序中,我们在主要区域中注册了视图,并且单击网格中的单元格(在本例中为xamdatagrid - Infragistics)将通过棱镜区域弹出行为构造启动另一个区域。

因此,当我们单击单元格时,将调用该视图后面的代码中的cellactivation操作,然后调用视图模型中的方法.RequestNavigate到为“辅助”弹出区域注册的视图(从而启动看似现有应用程序的对话框。)

我试图将父视图中的对象(网格中记录的值)传递给弹出窗口中启动的子视图,并发现没有任何预期的操作正在运行。

我有一个mediator对象,我们用它来将信息从子节点传递回父节点,但这不适用于另一个方向,因为调解器的发布/通知操作要求子视图“已经”实例化之前父发布以传递该信息。

我发现Prism.Events类中内置的事件聚合器结构似乎也没有工作(我假设因为相同的发布/订阅问题)。我可以通过父视图中的事件聚合器发布事件并在子视图中进行订阅,但是我必须“启动子视图”两次,以便将事件聚合器操作绑定到事件实际触发。

我理解这是相当含糊的(减去代码),但我正在寻找更多的起点,或任何遇到同样问题的人。子弹点场景如下:

  • 父视图已在现有区域中实例化。
  • 单击父视图中的单元格会在弹出区域中实例化(导航到)子视图。
  • 相同的点击操作需要将对象从父视图传递到子视图,以便子视图可以根据该对象过滤自己的数据。
  • 使用Prism / MVVM构建操作。

任何帮助,建议,指示,想法都会很棒。

3 个答案:

答案 0 :(得分:2)

我们有相同的场景,最终创建了一个注入我们的ViewModel的UiService。我们的ViewModel基类有一个SetModel方法,UiService在导航时调用该方法,用于将参数发送到目标视图。

以示例:

单击现有视图中的按钮。

Source ViewModel调用UiService ShowView(数据)。

UiService为请求的视图调用RequestNavigate。

UiService在目标ViewModel上调用SetModel(通过访问所请求视图的DataContext)从源ViewModel传入数据。

答案 1 :(得分:1)

根据您要传递的内容,使用INavigationAware

可以非常简单

听起来你想传递查询字符串 - 参数等等。打开窗口的代码将是这样的:

    var query = new UriQuery
        {
            { "MailItemKey", this.SelectedMailItem.MailItemKey.ToString(CultureInfo.InvariantCulture) }
        };

    RegionManager.RequestNavigate(RegionNames.Popup, typeof(MailItemView).Name + query.ToString());

MailItemViewModel里面,我们的弹出窗口的VM代码是这样的:

public override void OnNavigatedTo(NavigationContext navigationContext)
        {
            var mailItemKey = int.Parse(navigationContext.Parameters["MailItemKey"]);

            }

如果要传递自定义对象 - 它会更复杂。我会寻找MVVM in the box个样本 - 有一些关于它是如何完成的代码。我不得不重新完成它并且代码不是真正的可复制粘贴。

答案 2 :(得分:0)

听起来像是对RegionContext的完美使用。

父视图包含一个可以在其中激活多个“子”视图的区域。他们需要分享一些背景或数据。设置区域上下文并绑定或传递Region中所有“子”视图所需的信息。

参见RegionContext周围的Prism样本。