区域已在导航中注册错误

时间:2011-12-27 12:36:21

标签: c# wpf mvvm prism

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

<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的新手。在我完全失去的时候,任何有关正确方向的帮助或指示都会受到高度赞赏。

感谢。

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:2)

我喜欢使用Prism框架,但是我觉得他们的区域应该仅用于应用程序布局(MenuRegionNavigationRegionContentRegion等),而不是导航。将它们用于导航意味着让View控制应用程序流,我觉得这是ViewModel的工作。

为了创建像你概述的东西,我通常有一个包含

的父ViewModel
  • 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>