C# 使用带有Prsim的Unity BootStrapper将参数传递给Shell Viewmodel

C# 使用带有Prsim的Unity BootStrapper将参数传递给Shell Viewmodel,c#,unity3d,mvvm,prism,bootstrapper,C#,Unity3d,Mvvm,Prism,Bootstrapper,我已经创建了一个对话框服务,使用界面来显示自定义对话框/确认框(我知道Prism具有此功能,但对话框似乎不可自定义,并且与我的布局/颜色方案不匹配)。对话框服务具有一个注册函数,该函数将对话框视图类型注册为字典中的对话框视图模型类型。这样做是为了传递viewmodel,并以松散耦合的方式创建所需视图的实例。代码如下所示: private readonly IDialogService dialogService = new DialogService(Application.Curren

我已经创建了一个对话框服务,使用界面来显示自定义对话框/确认框(我知道Prism具有此功能,但对话框似乎不可自定义,并且与我的布局/颜色方案不匹配)。对话框服务具有一个注册函数,该函数将对话框视图类型注册为字典中的对话框视图模型类型。这样做是为了传递viewmodel,并以松散耦合的方式创建所需视图的实例。代码如下所示:

    private readonly IDialogService dialogService = new DialogService(Application.Current.MainWindow);

    // Registers the confirmation window viewmodel with the confirmation window view
    dialogService.Register<ConfirmationWindowViewModel, ConfirmationWindow>();
private readonly IDialogService dialogService=new dialogService(Application.Current.MainWindow);
//将确认窗口视图模型注册到确认窗口视图
dialogService.Register();
所以我最初的想法是尝试在unity bootstrapper中创建它(因为注册会传入视图和视图模型),但我似乎找不到这样做并传入dialog服务的方法

我必须注意,主窗口viewmodel的构造函数还为Prism注入了区域管理器和事件聚合器;我曾尝试在引导程序中创建一个实例并注册该实例,但创建区域管理器和注入会导致错误。如果我在主窗口viewmodel中声明并初始化dialog服务,它当然可以工作,但从我对MVVM的理解来看,我们不希望viewmodels了解任何视图,因此我试图找到另一种方法来实现这一点,而不破坏region manager和event aggregator的IoC


我对MVVM和Prism/Unity还不熟悉,所以我对这些概念的理解还没有完全巩固。

如果有人后来看到这一点并感到好奇,我的最终决定是完全放弃“Register”函数,转而支持一个可靠的约定

以前,我会使用此功能并保留所有已注册视图/视图模型的字典:

    dialogService.Register<ConfirmationWindowViewModel, ConfirmationWindow>();
在对话框界面中。现在,不管传入的是什么viewmodel,它都会像以前那样以更少的代码和不必要的链接来获取适当的视图

我知道Prism具有此功能,但对话框似乎不可自定义,并且与我的布局/配色方案不匹配


您可以创建任何您喜欢的对话框,只需从
PopupWindowAction
派生并覆盖
CreateWindow
(以及其他需要的方法)即可创建您一直想要的对话框。

这非常有意义!谢谢你,豪金格!我过去一直致力于重新发明车轮,但我肯定会尝试这种方法,而不是-现在可能能够完全摆脱这种服务:)
        var viewTypeName = viewModel.GetType().AssemblyQualifiedName.Replace("Model", ""); 
        var viewType = Type.GetType(viewTypeName);