1

我是 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,即使我可以毫无问题地注册这些区域的视图?

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

4

2 回答 2

1

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

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

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

于 2013-10-05T22:25:54.373 回答
1

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

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

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

于 2020-09-20T04:27:51.820 回答