【发布时间】:2009-12-07 17:56:32
【问题描述】:
我正在使用带有对话框的 M-V-VM。我用于创建对话框的过程如下:
- ViewModel 命令希望打开一个对话框。
- 它为对话框创建 ViewModel(我们称之为 DialogViewModel)。
- 然后它将 ViewModel 传递给 DialogProvider 以创建实际的 View。这使我的对话框可测试,因为提供程序可以提供真实视图或测试视图。
我有这一切工作。但是,目前我对DialogProvider的解决方案是使用反射,根据ViewModel的名称手动查找要实例化的View类,如下:
var viewModelType = viewModel.GetType();
var dialogTypeName = Regex.Replace(viewModelType.Name, "ViewModel$", "Dialog");
var viewType = Assembly.GetExecutingAssembly().GetType(dialogTypeName);
if (viewType == null)
throw new InvalidOperationException("Could not find view for given type.");
var dialog = (Dialog)viewType.GetConstructor(Type.EmptyTypes).Invoke(new object[0]);
dialog.DataContext = viewModel;
dialog.Owner = Application.Current.MainWindow;
return dialog;
这是次优的,因为 View 必须与 ViewModel 命名相同,并且必须在相同的命名空间中,等等。
理想情况下,我会使用 DataTemplate 机制来执行此操作。我想做的与对视图使用 DataTemplate 并使用 ContentPresenter 根据 DataTemplate 的 DataType 属性选择视图相同(请参阅Josh Smith's MVVM article。但是,我需要在 C# 代码中执行此操作(在DialogProvider)。
这可能吗?我在想像在 C# 中创建一个 ContentPresenter,设置它的 DataTemplate,然后到达它以拉出 Dialog 视图???
埃里克
【问题讨论】: