PRISM: 通过PopupRegions将对象/事件从父视图/VM传递到子视图/VM

3
我们正在使用Prism和MVVM创建用于医疗跟踪操作的应用程序。在此应用程序中,我们已经在主要区域注册了视图,并且在网格(此处是一个xamdatagrid - Infragistics)的单元格被点击时启动了另一个区域,采用了prism区域弹出行为构造。因此,当我们点击单元格时,代码后台中的cellactivation操作将被调用,然后调用视图模型中的方法以.RequestNavigate到已注册“次要”弹出区域的视图(从而启动似乎是现有应用程序上的对话框)。我试图从父视图(网格中记录的值)传递一个对象到在弹出窗口中启动的子视图,但发现没有一个预期的操作起作用。我有一个中介者对象,我们正在使用它从子级传递信息到父级,但是这不适用于另一个方向,因为中介者的发布/通知操作需要子视图“已经”实例化,然后才能由父级发布以传递该信息。我发现内置于Prism.Events类中的事件聚合器结构似乎也无法工作(我假设是由于相同的发布/订阅问题)。我可以通过事件聚合器从父视图中发布事件并在子视图中订阅,但是必须“两次”启动子视图才能使与事件聚合器操作相关联的事件实际触发。我理解这相当模糊(减去代码),但我正在寻找更多的起点,或者是否遇到了相同类型的问题。要点是:1.父视图已在现有区域中实例化。2.单击父视图中的单元格会实例化(导航到)弹出窗口区域中的子视图。3.相同的单击操作需要将对象从父视图传递到子视图,以便子视图可以根据该对象过滤其自己的数据。4.使用Prism / MVVM构建操作。任何帮助、建议、指针、想法都将很棒。
3个回答

2
我们曾经遇到过相同的情况,最终创建了一个UiService并将其注入到我们的ViewModel中。我们的ViewModel基类有一个SetModel方法,当导航时,UiService会调用该方法,向目标视图发送参数。
例如:
在现有视图中单击按钮。
源ViewModel调用UiService ShowView(data)。
UiService调用RequestNavigate以请求视图。
UiService通过访问所请求视图的DataContext,在目标ViewModel上调用SetModel,以传递来自源ViewModel的数据。

1

根据您想要传递的内容,使用INavigationAware可能非常简单。

听起来您想要传递类似查询字符串、参数等内容。打开窗口的代码将如下所示:

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

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

而在我们的弹出窗口的VM中MailItemViewModel内部的代码如下:

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

            }

如果你想传递自定义对象,那会更加复杂。我建议你寻找一些 MVVM in the box 的示例代码 - 其中有一些关于如何实现的代码。我曾经不得不重新编写很多代码,因此并不能直接复制粘贴。


如果PopupRegion之前没有被使用过,这似乎无法正常工作。 - Landerah

0

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

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

请参阅有关RegionContext的Prism示例。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接