2012-01-18 68 views
2

我们正在使用棱镜和MVVM进行医疗跟踪操作的应用程序。PRISM:将对象/事件从父项传递给子项带有PopupRegions的查看/虚拟机

在这个应用中,我们已经注册了意见主要区域和场景中,在网格单元(在这种情况下xamdatagrid - Infragistics的)点击将通过棱镜区域弹出行为构建启动另一个区域。

所以,当我们点击单元格时,会调用该视图后面的代码中的cellactivation操作,然后调用视图模型中的一个方法来.RequestNavigate注册到'secondary'弹出区域的视图(从而启动似乎是对现有应用程序的对话)。

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

我有一个中介对象,我们用来将信息从孩子传回给父母,但是这不起作用,因为中介的发布/通知操作需要子视图'已经'被实例化之前父母发布以传递该信息。

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

我明白这是相当模糊的(减去代码),但我更多地寻找一个起点,或者遇到同样问题的任何人。子弹点场景如下:

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

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

回答

1

我们有相同的场景,并最终创建一个注入我们的ViewModels的UiService。我们的ViewModel基类有一个SetModel方法,UiService在浏览时调用它来将参数发送到目标视图。

举例:

单击现有视图中的按钮。

Source ViewModel调用UiService ShowView(data)。

UiService调用请求视图的RequestNavigate。

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

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样本 - 有关如何完成的代码。我不得不重新处理它,代码不是真正可复制粘贴的。

+0

如果之前没有使用PopupRegion,这似乎不起作用。 – Landerah 2017-03-03 06:38:41

0

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

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

请参阅RegionContext周围的棱镜示例。

相关问题