我是否正确地处理了 MVVM / Prism / WPF 中相同视图的多个实例
Am I doing it correctly do deal with multiple instances of same view in MVVM / Prism / WPF
我正在尝试使用 Prism/WPF 构建模块化应用程序
例如我有 2 个模块
- 一个将提供 gui 来加载图像/解析文件夹的工具
- 将在服务处理图像后显示图像。
如下图所示,我想在我的应用程序中同时显示每个实例的 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 ) );
并让视图模型解析参数(本质上是字典)并对自身进行参数化。
或者,手动创建视图模型并将它们公开为选项卡列表,并为它们分配数据模板(从而绕过区域,迫使您的视图模型在不必要的无效状态下等待导航参数)。
我总是尽量避免让视图知道视图模型,只是感觉不对。视图的构造函数参数也是如此 - 它们往往会使事情复杂化。
我正在尝试使用 Prism/WPF 构建模块化应用程序 例如我有 2 个模块
- 一个将提供 gui 来加载图像/解析文件夹的工具
- 将在服务处理图像后显示图像。
如下图所示,我想在我的应用程序中同时显示每个实例的 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 ) );
并让视图模型解析参数(本质上是字典)并对自身进行参数化。
或者,手动创建视图模型并将它们公开为选项卡列表,并为它们分配数据模板(从而绕过区域,迫使您的视图模型在不必要的无效状态下等待导航参数)。
我总是尽量避免让视图知道视图模型,只是感觉不对。视图的构造函数参数也是如此 - 它们往往会使事情复杂化。