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

时间:2018-10-13 21:36:02

标签: c# unity3d mvvm prism bootstrapper

我已经使用界面创建了一个对话框服务以显示自定义对话框/确认框(我知道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的新手,所以我对这些概念的掌握还没有完全巩固。

2 个答案:

答案 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);
在对话框界面中

。现在,无论传入什么视图模型,它都将以更少的代码获取适当的视图,并且无需像以前那样进行必要的链接。