我知道有很多样本unig region管理和交互请求触发器,用于显示使用prism,WPF和MVVM的对话框。在我的情况下,我有不同的模块。例如,我有创建组织单位的模块,并将执行人员分配给新创建的单位。此视图需要在标准对话框窗口中显示,返回的对象为Model类型,在本例中为OrganizationUnit对象。在模态窗口中显示视图后,它输入了一个文本框,输入了执行人名,如果找不到匹配的人,则需要打开另一个创建人的对话窗口,并将创建的对象返回到已打开的对话窗口。我已经看到了在MVVM中使用对话框以及在PRISM中使用弹出区域行为和interactionrequesttrigger的所有示例。我没有太多使用自定义控件来显示弹出窗口,因为我需要的是标准的showdialog方法,可以从任何指定了回调的viewmodel调用。
我想要实现的方法是在我的shell中使用interactionrequesttriger,并在此触发器上执行对打开弹出对话框的初始调用。为了不使这一切变得非常复杂,我想要一些集中显示对话框的方法,并在显示其他对话框的对话框中,以及所有这些与回调。有人能指出我正确的方向吗?
By我想拥有单一控件DialogView,它将具有ContentControl,其中viewmodels注入其视图和按钮占位符,其中包含按钮;好的,取消,应用并想要绑定它们绑定到加载的viewmodels命令。
我知道所有这些听起来有点复杂和复杂,但可能有解决方案。请有人给我如何完成这项任务的想法
答案 0 :(得分:1)
我花了很多时间查看与您的要求几乎完全相同的交互请求。最后,我停止使用它们,因为它们为传统上非常简单的任务引入了很多复杂性。
相反,我使用我称之为UIService的东西,它基于IUIService的接口,因此如果你想运行自动化测试,可以模拟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