我们正在使用一个使用棱镜和MVVM进行医疗保健跟踪操作的应用程序。
在此应用程序中,我们在主要区域中注册了视图,并且单击网格中的单元格(在本例中为xamdatagrid - Infragistics)将通过棱镜区域弹出行为构造启动另一个区域。
因此,当我们单击单元格时,将调用该视图后面的代码中的cellactivation操作,然后调用视图模型中的方法.RequestNavigate到为“辅助”弹出区域注册的视图(从而启动看似现有应用程序的对话框。)
我试图将父视图中的对象(网格中记录的值)传递给弹出窗口中启动的子视图,并发现没有任何预期的操作正在运行。
我有一个mediator对象,我们用它来将信息从子节点传递回父节点,但这不适用于另一个方向,因为调解器的发布/通知操作要求子视图“已经”实例化之前父发布以传递该信息。
我发现Prism.Events类中内置的事件聚合器结构似乎也没有工作(我假设因为相同的发布/订阅问题)。我可以通过父视图中的事件聚合器发布事件并在子视图中进行订阅,但是我必须“启动子视图”两次,以便将事件聚合器操作绑定到事件实际触发。
我理解这是相当含糊的(减去代码),但我正在寻找更多的起点,或任何遇到同样问题的人。子弹点场景如下:
任何帮助,建议,指示,想法都会很棒。
答案 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样本。