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

Events PRISM:使用PopuRegions将对象/事件从父视图传递到子视图/VM,events,mvvm,prism,Events,Mvvm,Prism,我们正在使用一个使用prism和MVVM进行医疗跟踪操作的应用程序 在这个应用程序中,我们在主要区域中注册了视图,在这些场景中,单击网格中的一个单元格(在本例中为xamdatagrid-Infragistics)将通过prism区域弹出菜单启动另一个区域 因此,当我们单击单元格时,该视图的代码隐藏中的cellactivation操作被调用,然后调用视图模型中的方法。RequestNavigate到为“次要”弹出区域注册的视图(从而在现有应用程序上启动一个对话框) 我试图将一个对象从父视图(网格中

我们正在使用一个使用prism和MVVM进行医疗跟踪操作的应用程序

在这个应用程序中,我们在主要区域中注册了视图,在这些场景中,单击网格中的一个单元格(在本例中为xamdatagrid-Infragistics)将通过prism区域弹出菜单启动另一个区域

因此,当我们单击单元格时,该视图的代码隐藏中的cellactivation操作被调用,然后调用视图模型中的方法。RequestNavigate到为“次要”弹出区域注册的视图(从而在现有应用程序上启动一个对话框)

我试图将一个对象从父视图(网格中记录的值)传递到弹出窗口中启动的子视图,但发现预期的操作都不起作用

我有一个mediator对象,我们正在使用它将信息从子对象传递回父对象,但这在另一个方向不起作用,因为mediator的发布/通知操作要求在父对象发布以传递该信息之前实例化子视图

我发现Prism.Events类中内置的事件聚合器结构似乎也不起作用(我假设是因为相同的发布/订阅问题)。我可以通过事件聚合器从父视图发布事件,并在子视图中订阅,但我必须“两次”启动子视图,以使与事件聚合器操作关联的事件实际触发

我理解这是相当模糊的(除了代码),但我更多的是寻找一个起点,或者任何遇到相同问题的人。要点方案如下:

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

任何帮助、建议、指点和想法都会非常棒。

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

举例来说:

单击现有视图中的按钮

源视图模型调用UiService ShowView(数据)

UiService为请求的视图调用RequestNavigate


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

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

听起来您想传递查询字符串-参数等信息。打开窗口的代码如下:

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

    RegionManager.RequestNavigate(RegionNames.Popup, typeof(MailItemView).Name + query.ToString());
public override void OnNavigatedTo(NavigationContext navigationContext)
        {
            var mailItemKey = int.Parse(navigationContext.Parameters["MailItemKey"]);

            }
在弹出窗口的虚拟机代码
MailItemViewModel
中,如下所示:

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

    RegionManager.RequestNavigate(RegionNames.Popup, typeof(MailItemView).Name + query.ToString());
public override void OnNavigatedTo(NavigationContext navigationContext)
        {
            var mailItemKey = int.Parse(navigationContext.Parameters["MailItemKey"]);

            }

如果您想传递自定义对象,它将更加复杂。我会在框中查找
MVVM
samples-这里有一些关于如何实现的代码。我不得不重新编写它,代码不能真正复制粘贴。

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

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


请参阅RegionContext周围的Prism示例。

如果以前未使用PopupRegion,则这似乎不起作用。