使用弹出对话框和Prism4掌握详细信息

时间:2011-01-10 06:45:17

标签: mvvm prism

这个问题的版本已被提出,但我不认为这是重复的。我正在使用C#/ Prism4构建一个LOB应用程序,我正试图从第一天开始就建立一个体系结构。该应用程序将(最终)具有相当多的主/细节屏幕以及具有可编辑的嵌入网格的编辑屏幕。例如:显示可以通过弹出屏幕添加或编辑的用户列表。

目前,我认为一个简单的解决方案是将对话框作为隐藏面板数据绑定到同一个视图模型,其可见性由数据绑定控制。要编辑用户(使用上面的示例),请复制要编辑的数据,然后将IsInEditMode标志设置为true以显示对话框。然后,正常命令可以捕获“保存”/“取消”按钮以更新模型(或不更新)。

虽然这听起来很简单,但感觉有点不对劲。关注点分离,只是感觉视图模型被多路复用。

我遇到了Prism InteractionRequest指南,但这似乎更适合简单的弹出窗口('你确定要取消吗?')。

我需要一个可以跨越数十个屏幕的解决方案。它必须简单易维护。

提前致谢。

3 个答案:

答案 0 :(得分:2)

一般方法是使用如下界面的所谓对话服务:

public interface IDialogService
{        
    bool? ShowDialog<TViewModel>(TViewModel viewModel);
}

无论何时需要显示对话框,都可以调用ShowDialog方法传递对话框的视图模型。其余的服务需要服务。它可以显示一个隐藏的面板,真实的对话窗口或弹出窗口 - 它取决于实现,并且主叫方对它没有任何了解。

答案 1 :(得分:1)

在我看来,主要细节需要一个自己的视图(如果细节是多个模型对象,可能需要VM部分。)

那就是说,我肯定会使用PopupRegionBehavior,这是Prism 2.2的RI的一部分。这对于这种情况特别有用,因为它允许您在特定区域中注册主要详细信息视图(如果您决定将详细信息提取到命令行管理程序中,这仍然有效。)

many threads in the Prism forum at codeplex谈论这个。

答案 2 :(得分:0)

我不同意你的对话框总是应该拥有它自己的VM,调用方可以只传递它自己的DataContext,这就是你不必处理同步maser / child ViewModel而且它无关关注的分离。例如,您有一个用户配置文件表单(maser),并且有模态对话框地址 - 如果在对话框关闭后传递配置文件的vm,则会自动更新与地址相关的属性和视图字段(享受绑定)。