我是否正确地处理了 MVVM / Prism / WPF 中相同视图的多个实例

Am I doing it correctly do deal with multiple instances of same view in MVVM / Prism / WPF

我正在尝试使用 Prism/WPF 构建模块化应用程序 例如我有 2 个模块

如下图所示,我想在我的应用程序中同时显示每个实例的 2 个实例。

所以在我的主视图中,我创建了 4 个区域,即 TopLeft、TopRight、BottomLeft、BottomRight,因为我希望将来所有这些东西都是模块化的/可配置的,所以我在一个 json 文件中区域和视图类型之间的关系,所以我可以在相应棱镜模块的 OnInitialized 中动态注册它们。

foreach (IConfigurationSection viewDeclaration in viewsDeclaration)
       {
            string id = _configuration[viewDeclaration.Path + ":id"] + "View";

            if (typeof(ImageBrowserView).Name == id)
            { 
                string region = _configuration[viewDeclaration.Path + ":region"];
                //regionManager.RegisterViewWithRegion(region, typeof(ImageBrowserView));
                ImageBrowserView view = new ImageBrowserView(_configuration[viewDeclaration.Path + ":msg_grp_id"]);
                regionManager.Regions[region].Add(view, region + "View");
            }
        }

如您所见,我正在手动创建视图对象以使用参数对其进行初始化。这个参数 用于在应用程序中进一步指示图像的来源(如加载它的模块的 id)。因此,当我在视图模型中需要它时,我为我的视图模型创建了一个接口,需要此信息来从视图构造函数分配值。

 public ImageBrowserView(string groupId)
    {
        InitializeComponent();
        
        IViewModelWithGroupId vm = (IViewModelWithGroupId)this.DataContext;
        vm.SetGroupId(groupId);
    }

它正在工作,但我不确定它是否是正确的解决方案,因为我对 WPF/MVVM 世界还很陌生。

非常感谢任何建议。

如果你想坚持使用区域,你应该为此使用导航和导航参数。 View model-first 过去是 Prism 的事情,但现在他们希望一切都使用 view model 定位器。

您可以遍历配置并为每个条目导航

_regionManager.RequestNavigate( entry.Region, entry.View, new NavigationParameters( entry.Parameters ) );

并让视图模型解析参数(本质上是字典)并对自身进行参数化。

或者,手动创建视图模型并将它们公开为选项卡列表,并为它们分配数据模板(从而绕过区域,迫使您的视图模型在不必要的无效状态下等待导航参数)。

我总是尽量避免让视图知道视图模型,只是感觉不对。视图的构造函数参数也是如此 - 它们往往会使事情复杂化。