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