【问题标题】:PRISM: Passing object/events from parent to child View/VM with PopupRegionsPRISM:使用 PopupRegions 将对象/事件从父视图/VM 传递到子视图/VM
【发布时间】:2012-02-13 12:10:13
【问题描述】:

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

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

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

我正在尝试将一个对象从父视图(网格中记录的值)传递到弹出窗口中启动的子视图,但发现没有任何预期的操作有效。

我有一个调解器对象,我们用它来将信息从孩子传回给父母,但这在另一个方向上不起作用,因为调解器的发布/通知操作要求子视图“已经”在父母发布以传递该信息。

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

我知道这相当模糊(减去代码),但我正在寻找更多的起点,或者任何遇到相同问题的人。要点场景如下:

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

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

【问题讨论】:

    标签: events mvvm prism


    【解决方案1】:

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

    举例:

    单击现有视图中的按钮。

    Source ViewModel 调用 UiService ShowView(data)。

    UiService 为请求的视图调用 RequestNavigate。

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

    【讨论】:

      【解决方案2】:

      根据您想要传递的内容,使用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 样本 - 有一些关于它是如何完成的代码。我不得不重新设计它,而且代码并不是真正可复制粘贴的。

      【讨论】:

      • 如果之前没有使用过 PopupRegion,这似乎不起作用。
      【解决方案3】:

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

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

      查看围绕 RegionContext 的 Prism 示例。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-28
        • 1970-01-01
        • 2013-11-08
        相关资源
        最近更新 更多