Prism Parent TabControl 子区域

Prism Parent TabControl Child Regions

正在尝试在另一个区域内创建 TabControl 区域。 TabControl 有一组 Views 将被添加到其中,它们各自有 ViewModels.

但是 View 没有出现,tabitem 没有出现,只显示一个 View,或者我收到以下错误:

System.ArgumentException: 'This RegionManager does not contain a Region with the name 'ParentTabRegion'. (Parameter 'regionName')'

主菜单视图:

<Grid>
    <ContentControl prism:RegionManager.RegionName="ContentRegion" />
</Grid>

主菜单视图模型:

public class MainMenuViewModel : BindableBase
{
    private readonly IRegionManager _regionManger;

    public MainMenuViewModel(IRegionManager regionManager)
    {
        _regionManger = regionManager;

        _regionManger.RequestNavigate("ContentRegion", "ParentView");

    }
}

父视图:

<Grid>
    <TabControl prism:RegionManager.RegionName="ParentTabRegion" />
</Grid>

父视图模型:

public class ParentViewModel : BindableBase
{
    private readonly IRegionManager _regionManger;

    private Child1View _tab1 = new Child1View();
    private Child1View Tab1
    {
        get { return _tab1; }
        set { SetProperty(ref _tab1, value); }
    }
    private Child2View _tab2 = new Child2View();
    private Child2View Tab2
    {
        get { return _tab2; }
        set { SetProperty(ref _tab2, value); }
    }

    public ParentViewModel(IRegionManager regionManger)
    {
        _regionManger = regionManger;

        // Gives 'This RegionManager does not contain a Region with the name 'GeneralDataTabRegion'. (Parameter 'regionName')' error
        _regionManger.AddToRegion("ParentTabRegion", typeof(Child1View));
        _regionManger.AddToRegion("ParentTabRegion", typeof(Child2View));

        //I've also tried the following
        
        // Same error as above
        // _regionManger.Regions["ParentTabRegion"].Add(typeof(Tab1View));
        // _regionManger.Regions["ParentTabRegion"].Add(typeof(Tab2View));

        // Same error as above
        // _regionManger.AddToRegion("ParentTabRegion", Tab1);
        // _regionManger.AddToRegion("ParentTabRegion", Tab2);

        // Only the last registered view is displayed
        // _regionManger.RegisterViewWithRegion("ParentTabRegion", typeof(Tab1));
        // _regionManger.RegisterViewWithRegion("ParentTabRegion", typeof(Tab2));
    }
}

我在所有视图中也有 prism 命名空间:

xmlns:prism="http://prismlibrary.com/"
prism:ViewModelLocator.AutoWireViewModel="True"

也许我没有以某种方式注册 ParentTabRegion?但我不必注册其他地区,它们似乎开箱即用。

如果您知道我做错了什么或者我遗漏了什么,请告诉我。谢谢。

我只想发表评论,但由于声誉不佳而无法发表评论。无论如何..

检查这个post

如评论中所述:“问题在于如何在 ViewModel 中注入范围区域” Brian 的这段视频应该可以帮助您解决这个问题。

https://app.pluralsight.com/library/courses/prism-mastering-tabcontrol

我最后做的有点不同,因为我真的不需要动态添加 Tabs

所以我最终做的只是将所有 ViewModels 添加到 BindableBaseObservableCollection。然后我使用 DataTemplate.

将它们添加到视图中

父视图模型:

private ObservableCollection <BindableBase> _childTabs;

public ObservableCollection <BindableBase> ChildTabs
{
   get { return _childTabs; }
   set { _childTabs = value; }
}

public ParentViewModel() 
{    
    ChildTabs = new ObservableCollection <BindableBase> {
      new Child1ViewModel(),
      new Child2ViewModel()
    };
}

父视图:

<TabControl ItemsSource="{Binding ChildTabs}"
                SelectedIndex="0">
  <TabControl.Resources>
    <DataTemplate DataType="{x:Type vm:Child1ViewModel}">
      <view:Child1 />
    </DataTemplate>
    <DataTemplate DataType="{x:Type vm:Child2ViewModel}">
      <view:Child2 />
    </DataTemplate>
    </DataTemplate>
  </TabControl.Resources>
  <TabControl.ItemTemplate>
    <DataTemplate>
      <TextBlock Text="{Binding Title}" />
    </DataTemplate>
  </TabControl.ItemTemplate>
</TabControl>

虽然我仍然觉得自己做错了什么,但这对我来说并不像 MVVM...

我测试了一些其他的东西。由于我不需要动态选项卡,我发现这是使用 Prism 的最干净的解决方案:

父视图模型:

public ParentViewModel(IRegionManager regionManager)
{
    _regionManager = regionManager;
    _regionManager.RegisterViewWithRegion("ChildRegion", typeof(Child1View));
    _regionManager.RegisterViewWithRegion("ChildRegion", typeof(Child2View));
}

父视图:

<UserControl.Resources>
  <Style TargetType="TabItem">
    <Setter Property="Header"
    Value="{Binding DataContext.Title}"/>
  </Style>
</UserControl.Resources>

<Grid>
    <TabControl prism:RegionManager.RegionName="ChildRegion" />
</Grid>