我是Prism的新手,我正在使用Prism的“区域”概念编写我的第一个应用程序。我目前有一个包含单个区域的Shell
应用程序,我在其中显示在单独模块中定义的视图。此视图有两个自己的区域Subregion1
和Subregion2
,它们显示模块中定义的两个视图。
这一切都正常,视图和子视图显示在正确的位置。但是,当我尝试在任何视图或子视图的视图模型中找到其中一个子视图时(使用regionManager.Regions["Subregion1"];
),我会遇到错误:
The region manager does not contain the SiteManager.SiteList region.
我最初认为这可能是拥有IRegionManager
个多个实例的问题,但我读过的大多数文档都表明提供了IRegionManager
的全局实例,除非有一个范围{ {1}}是特别要求的。
我也尝试过静态IRegionManager
和RegionManager.UpdateRegions()
的各种组合,但无济于事。
关于为什么RegionManager.SetRegionManager( .... )
无法找到我要求的区域的任何想法,即使我可以毫无问题地在这些区域注册视图?
编辑:我正在尝试访问子视图的viewmodel中命令中的区域。
答案 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}"/>
还请注意,如果要创建无模式对话框,则可能需要为每个对话框窗口创建子区域,但这是另一个问题。我希望以后的版本中会更容易处理。