导航上已经注册的区域错误

本文关键字:区域 错误 注册 导航 | 更新日期: 2023-09-27 18:18:55

我有一个TabControl区域在Shell.xaml:

<TabControl Name="TabRegionControl" prism:RegionManager.RegionName="TabRegion" />

用户可以点击一个按钮打开一个新的选项卡,调用:

RegionManager.RequestNavigate("TabRegion", new Uri("Search?X=1", UriKind.Relative));

在选项卡控件中创建新选项卡并显示视图。视图包含多个子区域(以及每个区域的视图)。到目前为止,这是可行的。当用户再次单击按钮时,我得到一个错误,说区域已经注册。

我知道这是发生的,因为区域不能在同一区域管理器中再次注册。我读到过作用域区域可以用来解决这个问题。正如我所能弄清楚的那样,我将上面的RequestNavigate替换为以下内容,以创建一个有作用域的RegionManager:

SearchViewModel svm = new SearchViewModel();
IRegion detailsRegion = _regionManager.Regions["TabRegion"];
SearchView view = new SearchView(svm);
IRegionManager scopedRegionManager = detailsRegion.Add(view, null, true);
svm.ScopedRegionManager = scopedRegionManager;
svm.LoadViews();

我相信我必须手动加载视图到我的方法LoadViews()子区域,但子区域不显示。

它们在Search.xaml中的定义如下:

<ContentControl Background="White" Grid.Row="0"  Grid.Column="0"        
Regions:RegionManager.RegionName="SubRegion1"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
HorizontalContentAlignment="Stretch"
VerticalContentAlignment="Stretch"  />

作为起点,scopedRegionManager在它的区域集合中似乎没有我的任何子区域。

编辑

我现在看到作用域区域管理器的区域集合中的子区域。子视图仍然没有显示,这是我如何试图加载LoadViews方法中的子视图,这可能是完全错误的:

ViewModelSub1 vm = new ViewModelSub1();
IRegion detailsRegion = _regionManager.Regions["RegionSub1"];
SubView1 sView = new SubView1(vm);
IRegionManager detailsRegionManager = detailsRegion.Add(sView, null, false);
detailsRegion.Activate(wsView);

我是WPF和MVVM的新手。我完全迷路了,请给予任何帮助或指点,我将不胜感激。

谢谢。

导航上已经注册的区域错误

我们有同样的问题,我们已经尝试使用范围区域管理器-没有任何成功。所以我们最终做了一个蛮力解决方案,但可能不是预期的用途;

public void OnNavigatedFrom(NavigationContext navigationContext)
{
    navigationContext.NavigationService.Region.RegionManager.Regions.Remove("regionname");
}

;当导航离开包含"作用域"区域的视图/视图模型时,我们只需从区域管理器中删除该区域。当下次实例化视图时,它将把该区域添加到区域管理器中,而不会抛出任何异常。

我喜欢使用Prism框架,但是我觉得他们的区域应该只用于应用程序布局(MenuRegion, NavigationRegion, ContentRegion等),而不是导航。使用它们进行导航意味着让视图控制应用程序流,我觉得这是ViewModels的工作。

要创建您概述的东西,我通常有一个父视图模型,其中包含

  • ObservableCollection<ITabViewModel> Tabs
  • int SelectedTabIndex
  • ICommand AddNewTabCommand

我的TabControl定义看起来像这样:

<TabControl ItemsSource="{Binding Tabs}" SelectedIndex="{Binding SelectedTabIndex}" />

AddNewTab命令只是将一个新对象添加到Tabs集合并将其设置为Selected

void AddNewTab()
{
    var newTab = new TabAViewModel();
    Tabs.Add(newTab);
    SelectedTabIndex = Tabs.IndexOf(newTab);
}

要决定显示什么视图,我通常使用DataTemplates

<DataTemplate TargetType="{x:Type local:TabAViewModel}">
    <local:TabAView />
</DataTemplate>
<DataTemplate TargetType="{x:Type local:TabBViewModel}">
    <local:TabBView />
</DataTemplate>