【问题标题】:RegionManager unable to find region inside of moduleRegionManager 无法在模块内找到区域
【发布时间】:2020-09-20 12:27:51
【问题描述】:

我是 Prism 的新手,我目前正在使用 Prism 的“区域”概念编写我的第一个应用程序。我目前有一个包含单个区域的Shell 应用程序,我在其中显示在单独模块中定义的视图。此视图有两个自己的区域,Subregion1Subregion2,它们显示模块中定义的两个视图。

这一切正常,视图和子视图显示在正确的位置。但是,当我尝试在任何视图或子视图的视图模型中查找其中一个子视图时(使用 regionManager.Regions["Subregion1"];),我收到了错误:

The region manager does not contain the SiteManager.SiteList region.

我最初认为这可能是有多个IRegionManagers 实例的问题,但我读过的大部分文档都表明提供了IRegionManager 的全局实例,除非特别指定了作用域IRegionManager请求。

我还尝试了静态RegionManager.UpdateRegions()RegionManager.SetRegionManager( .... ) 的各种组合,但无济于事。

关于为什么RegionManager 无法找到我请求的区域的任何想法,即使我可以毫无问题地注册这些区域的视图?

编辑:我正在尝试访问子视图视图模型中的命令中的区域。

【问题讨论】:

  • 您是在显示包含它们的视图之前还是之后尝试访问子区域?
  • @AdiLester 之后。就我而言,我在子区域视图的视图模型中访问它们。

标签: c# wpf unity-container prism


【解决方案1】:

您收到此异常的原因是您试图从视图/视图模型的构造函数访问尚未创建的区域。您可以通过尝试从视图的 Loaded 事件访问它们来轻松验证这一点,它们已经被初始化。

关于为什么 RegionManager 无法找到区域的任何想法 我正在请求,即使我可以将视图注册到这些区域 没有任何问题?

将视图注册到区域不需要实际加载区域。当您将视图注册到区域时,该信息会保存在内存中,并且当创建区域时(可能会更晚),Prism 知道使用适当的视图初始化该区域。

【讨论】:

  • 我实际上是在视图模型中定义的命令中访问该区域,因此当我尝试访问该区域时,视图和视图模型应该已经存在。
【解决方案2】:

我知道这是一个老问题,但我遇到了同样的问题,所以我会为将来遇到同样问题的人添加我的发现。

在当前的 Prism 实现中,默认区域管理器作为附加依赖属性存储到 shell 窗口。

在 Prism 7.2 中,区域管理器在应用程序基类中设置为 shell 窗口。

public virtual void Initialize()
{
    ...
    var shell = CreateShell();
    if (shell != null)
    {
        RegionManager.SetRegionManager(shell, _containerExtension.Resolve<IRegionManager>());
        RegionManager.UpdateRegions();
        InitializeShell(shell);
    }
    
    InitializeModules();
}

虽然它是一个单例,但它不会自动继承到子窗口,包括由DialogService 创建的对话框。所以如果你想在对话框中使用区域,你必须手动附加区域管理器

有几个问题基本上与同一个问题有关。

这是另一个将区域管理器设置为对话框的示例。


public class SampleDialogViewModel {

    public IRegionManager RegionManager { get; }

    public SampleViewModel(IRegionManager regionManager)
    {
         RegionManager = regionManager;
    }

    ....
        
    protected override void OnDialogClosed(IDialogResult result)
    {

        // You also have to manually remove region when dialog is closed. 
        RegionManager.Regions.Remove("MyRegion");

    }

}

在您看来,您可以使用 Prism 附加属性将区域管理器绑定到元素。

<ContentControl Grid.Row="0" 
    prism:RegionManager.RegionName="MyRegion"
    prism:RegionManager.RegionManager="{Binding RegionManager}"/>

另外请注意,如果您想创建无模式对话框,您可能需要为每个对话框窗口创建子区域,但这是另一个问题。我希望这在未来的版本中会更容易处理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-29
    • 2011-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-16
    • 2013-05-19
    相关资源
    最近更新 更多