RegionManager无法在模块内找到区域

时间:2013-10-04 23:06:09

标签: c# wpf unity-container prism

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

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

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

我最初认为这可能是拥有IRegionManager个多个实例的问题,但我读过的大多数文档都表明提供了IRegionManager的全局实例,除非有一个范围{ {1}}是特别要求的。

我也尝试过静态IRegionManagerRegionManager.UpdateRegions()的各种组合,但无济于事。

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

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

2 个答案:

答案 0 :(得分:1)

您获得此异常的原因是您尝试从视图的/ viewmodel的构造函数访问区域,但尚未创建它们。您可以通过尝试从视图的Loaded事件中访问它们来轻松验证它们,它们已经初始化了。

  

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

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

答案 1 :(得分:0)

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

在当前的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}"/>

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