gpt4 book ai didi

c# - 使用 Prism,如何将作用域 RegionManager 注入(inject)服务?

转载 作者:太空狗 更新时间:2023-10-30 01:16:23 26 4
gpt4 key购买 nike

我正在开发一个 Prism 应用程序,它包含一个包含多个子区域的 TabControl。因此,我根据 Brian Lagunas 在他的 PluralSight 类(class)中描述的模式实现了自定义 RegionBehavior,该类(class)位于 https://app.pluralsight.com/library/courses/prism-mastering-tabcontrol/。并注入(inject)了自定义 RegionNavigationContentLoader(在上述类(class)中也有描述),以确保我没有异常,并且可以在我的 TabControl 的多个选项卡上具有相同名称的区域。

对于无法访问 PluralSight 的用户:

我实现了一个行为来监视区域的 View 集合,并在它发生变化时检查添加的 View 或其 DataContext 是否实现了特定接口(interface)。如果检测到此接口(interface),它将作用域 RegionManager 设置为该接口(interface)的属性,因此进入作用域区域的所有 View 都可以知道其作用域 RegionManager。

但是,我也有一些服务需要这个作用域 RegionManager 才能导航到我的 TabControl 内的子区域。

由于我是在我的容器中创建此服务,因此它会注入(inject)全局 RegionManager 而不是范围内的 RegionManager。

我的问题是:

  1. 是否有任何模式或结构允许将作用域区域管理器注入(inject)服务?
  2. 如果对 1 的回答是否定的,服务是否应该导航到区域,或者这是一个坏主意吗?

更新

下面是我的应用程序的计划结构。我希望它能说明我为什么要从服务中导航到范围区域:

Application Layout

如前所述,该应用程序包含一个 TabControl,其中每个 TabItem 都包含一个分析

一个分析总是由一个选定的可视化组成,可以在右上角的框中选择。选择可视化后,它会在服务中激活,该服务主要调用代码来生成可视化、检查设置的有效性等。

然后可视化应显示在 VisualisationRegion 中,特定于可视化的设置应显示在 SettingsRegion 中。

我的计划是从服务内部导航到这两个区域。

由于无法事先生成可视化(有些检查必须始终在显示之前执行,我无法直接从 View / View 模型导航。即使那是可能的,显示所有可视化类型的 View 也不知道作用域 RegionManager,因为它是组合 View 的一部分(父 View 知道并且当然可以将作用域 RegionManager 注入(inject)其 subview ,但在我看来这就像代码味道)

这种类型的应用程序是否可能不适合 Prism 导航方法,或者您是否知道如何重组我的应用程序以更好地适应 Prism?

最佳答案

您无法将作用域区域管理器注入(inject)您的服务。哎呀,你甚至不能将作用域区域管理器注入(inject) Viewmodel,这就是为什么你首先需要自定义行为来获得它。

  1. 一个选项是向您的服务添加一个 RegionManager 属性,并将该属性设置为您 VM 中的范围区域管理器实例。
  2. 我不确定是否会有任何服务导航到范围区域。这似乎给服务赋予了太多责任,这可能会导致不必要的复杂性。在这种情况下,我希望该服务返回一个结果,我的 VM 可以响应该结果以便导航到需要的位置。根据服务需要导航的原因,您可以采用另一种方法来完成同样的事情。

更新:我会将可视化类型作为主选项卡式 View 的一部分。我看不出为什么那应该是一个单独的区域。这将使您能够访问范围区域管理器,并且您现在可以将 View 导航到 VisualizationRegion。该服务不应该知道区域经理。只需响应可视化类型选择更改、调用您需要的服务、获取结果并进行相应导航即可。

关于c# - 使用 Prism,如何将作用域 RegionManager 注入(inject)服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35340522/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com