【问题标题】:Passing Parameters to Shell Viewmodel Using Unity BootStrapper With Prsim使用 Unity BootStrapper 和 Prsim 将参数传递给 Shell Viewmodel
【发布时间】:2023-03-15 10:15:01
【问题描述】:

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

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

    // Registers the confirmation window viewmodel with the confirmation window view
    dialogService.Register<ConfirmationWindowViewModel, ConfirmationWindow>();

所以我最初的想法是尝试在统一引导程序中创建它(因为注册会传入视图和视图模型),但我似乎找不到这样做的方法并传入对话服务。

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

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

【问题讨论】:

    标签: c# unity3d mvvm prism bootstrapper


    【解决方案1】:

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

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

    【讨论】:

    • 这很有意义!谢谢豪金格!我去重新发明轮子,但肯定会尝试这种方法 - 现在可能完全摆脱该服务:)
    【解决方案2】:

    如果以后有人看到这个并且好奇,我的最终决定是完全摆脱“注册”功能,转而采用可靠的约定。

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

        dialogService.Register<ConfirmationWindowViewModel, ConfirmationWindow>();
    

    这将注册并存储它们在字典中,这样我以后可以传入一个视图模型并创建一个适当的确认消息视图的实例。相反,我删除了与这部分解决方案有关的所有代码,并用一些与命名约定混合的反射替换它。

    第 1 步:确保所有视图都以 View 后缀命名。 第 2 步:确保所有视图模型都以 ViewModel 后缀命名。 第 3 步:确保这些都在适当命名的命名空间中(视图命名空间中的视图和视图模型命名空间中的视图模型)。

    (反正大部分^^已经完成)

    最后一步:用此代码替换字典:

            var viewTypeName = viewModel.GetType().AssemblyQualifiedName.Replace("Model", ""); 
            var viewType = Type.GetType(viewTypeName);
    

    在对话框界面中。现在,无论传入什么视图模型,它都会以更少的代码拉取适当的视图,并且不需要像以前那样进行必要的链接。

    【讨论】:

      猜你喜欢
      • 2021-06-08
      • 2011-12-09
      • 2021-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多