我知道有很多示例 unig 区域管理和交互请求触发器来显示使用 prism、WPF 和 MVVM 的对话框。在我的情况下,我有不同的模块。例如,我有创建组织单位并将执行人员分配给新创建的单位的模块。此 View 需要显示在标准对话窗口中,并返回模型类型的对象,在这种情况下为 OrganizationUnit 对象。在模式窗口中显示 View 后,它有一个文本框输入,此处输入执行人员姓名,如果找不到匹配的人员,则需要打开另一个创建人员并将创建的对象返回到已打开的对话框窗口的对话框窗口。我已经看到了在 MVVM 中使用对话框以及在 PRISM 中使用弹出区域行为和交互请求触发器的所有示例。我没有从使用自定义控件来显示弹出窗口中得到太多,因为我所需要的只是标准的 showdialog 方法,它可以从任何指定回调的 View 模型中调用。
我想要实现这一点的方法是在我的 shell 中有interactionrequesttriger,并在此触发器上执行打开弹出对话框的初始调用。为了不让这一切变得非常复杂,我想要一些集中的方式来显示对话框和在显示其他对话框的对话框中,所有这些都带有回调。有人能指出我正确的方向吗?
顺便说一句,我希望拥有单个控件 DialogView ,它将具有 ContentControl ,其中 View 模型注入(inject)其 View 和按钮占位符,其中包含按钮;好的,取消,应用并希望绑定(bind)让它们绑定(bind)到加载的 View 模型命令。
我知道这一切听起来有点复杂和复杂,但可能有解决方案。请有人给我如何完成这项任务的想法
最佳答案
我花了很多时间查看与您的要求几乎相同的交互请求。最后,我停止使用它们,因为它们给传统上非常简单的任务带来了很多复杂性。
相反,我使用我称之为 UIService 的东西,它基于 IUIService 的接口(interface),因此如果你想运行自动化测试,可以模拟 GUI 部分。
每个模块都有自己的 UIService,shell 有一个通用的 UIService,任何模块都可以通过 IShellUIService 访问它。
制作 ui 服务的优点是您可以使用传统的对话功能并使其完全兼容 mvvm,并且如果需要,还可以将传统的对话功能换成其他机制。
示例 UIService
public class UIService : IUIService
{
public UIService(IUnityContainer container)
: base(container)
{
}
public ViewModelBase DialogBoxUserDetails(ViewModelBase viewModel)
{
ShowDialog(new UserDetailsView(), ref viewModel);
return viewModel;
}
protected bool? ShowDialog(FrameworkElement view, ref ViewModelBase viewModel)
{
Window w = new Window();
//make sure the new dialogbox belongs to the parent window
HwndSource winformWindow = (System.Windows.Interop.HwndSource.FromDependencyObject(Application.Current.Windows[0]) as System.Windows.Interop.HwndSource);
var interopHelperAdd = new WindowInteropHelper(w) { Owner = winformWindow.Handle };
//use the applications wpf theme
w.Resources = Application.Current.Windows[0].Resources;
w.DataContext = viewModel;
w.Content = view;
bool? bResult = w.ShowDialog();
if (bResult != true)
{
viewModel.Dispose();
viewModel = null;
}
return bResult;
}
}
如果对话框被取消或关闭,上述更新您将 vm 设置为 null,否则返回更新后的 vm
有关以 mvvm 友好的方式将取消按钮连接到对话框关闭的信息,请查看 answer
关于wpf - 与 PRISM 的对话交互请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8992685/