我已经使用界面创建了一个对话框服务以显示自定义对话框/确认框(我知道Prism具有此功能,但是对话框似乎不可自定义并且与我的布局/配色方案不匹配) 。对话框服务具有注册功能,可将对话框视图类型与对话框视图模型类型一起注册在字典中。这样做是为了使视图模型可以传入并以松散耦合的方式创建,可以创建所需视图的实例。代码如下:
private readonly IDialogService dialogService = new DialogService(Application.Current.MainWindow);
// Registers the confirmation window viewmodel with the confirmation window view
dialogService.Register<ConfirmationWindowViewModel, ConfirmationWindow>();
所以我最初的想法是尝试在统一的引导程序中创建它(因为注册将视图和视图模型传递给我),但是我似乎找不到一种方法来传递对话框服务。
我必须注意,主窗口viewmodel的构造函数还会为Prism注入区域管理器和事件聚合器;我曾尝试在引导程序中创建一个实例并注册该实例,但是创建区域管理器与注入会导致错误。如果我在主窗口viewmodel中声明并初始化对话框服务,则它当然可以工作,但是根据我对MVVM的了解,我们不希望Viewmodel对视图有任何了解,因此我试图寻找另一种方法来做到这一点,不会破坏区域经理和事件聚合者的IoC。
我是MVVM和Prism / Unity的新手,所以我对这些概念的掌握还没有完全巩固。
答案 0 :(得分:1)
我知道Prism具备此功能,但对话框似乎不可自定义并且与我的布局/配色方案不匹配
您可以创建任何您喜欢的对话框,只需从PopupWindowAction
派生并覆盖CreateWindow
(以及其他根据需要的方法)即可创建您一直想要的对话框。
答案 1 :(得分:0)
以防万一以后有人对此感到好奇,我最终的决定是完全放弃'Register'功能,转而采用可靠的约定。
以前,我将使用此功能并保留所有已注册视图/视图模型的字典:
dialogService.Register<ConfirmationWindowViewModel, ConfirmationWindow>();
这将注册take并将它们存储在字典中,因此我以后可以传递给viewmodel并创建适当的确认消息视图的实例。相反,我删除了有关解决方案这一部分的所有代码,并用一些与命名约定混合的反射代替了它。
第1步:确保所有视图都以结尾后缀View命名。 步骤2:确保所有的ViewModel都以后缀ViewModel命名。 步骤3:确保所有这些都在适当命名的命名空间中(视图命名空间中的视图和视图模型命名空间中的视图模型)。
(大部分^^还是完成了)
最后一步:用以下代码替换字典:
var viewTypeName = viewModel.GetType().AssemblyQualifiedName.Replace("Model", "");
var viewType = Type.GetType(viewTypeName);
在对话框界面中。现在,无论传入什么视图模型,它都将以更少的代码获取适当的视图,并且无需像以前那样进行必要的链接。