Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 棱镜父选项卡控制子区域_C#_Wpf_Mvvm_Prism_Tabcontrol - Fatal编程技术网

C# 棱镜父选项卡控制子区域

C# 棱镜父选项卡控制子区域,c#,wpf,mvvm,prism,tabcontrol,C#,Wpf,Mvvm,Prism,Tabcontrol,试图在另一个区域内创建TabControl区域。选项卡控件有一组将添加到其中的视图,以及各自的视图模型 但是,视图没有显示,选项卡项没有显示,而是只显示了一个视图,或者出现以下错误: System.ArgumentException: 'This RegionManager does not contain a Region with the name 'ParentTabRegion'. (Parameter 'regionName')' MainMenuView: <Grid>

试图在另一个区域内创建
TabControl
区域。
选项卡控件
有一组将添加到其中的
视图
,以及各自的
视图模型

但是,
视图
没有显示,
选项卡项
没有显示,而是只显示了一个
视图
,或者出现以下错误:

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

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

<Grid>
    <TabControl prism:RegionManager.RegionName="ParentTabRegion" />
</Grid>
我在所有视图中都有prism名称空间:

xmlns:prism="http://prismlibrary.com/"
prism:ViewModelLocator.AutoWireViewModel="True"
也许我没有注册
ParentTabRegion
?但我不必注册其他地区,它们似乎只是开箱即用


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

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

查看此帖子

如评论中所述:“问题在于如何在ViewModel中注入作用域” 布莱恩的这段视频应该可以帮助你解决这个问题


由于我实际上不需要动态添加
选项卡,所以我最终的做法有点不同

所以我最后做的就是将所有的
ViewModels
添加到
BindableBase
observateCollection
。然后我使用
数据模板将它们添加到视图中

父视图模型:

public class MainMenuViewModel : BindableBase
{
    private readonly IRegionManager _regionManger;

    public MainMenuViewModel(IRegionManager regionManager)
    {
        _regionManger = regionManager;

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

    }
}
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));
    }
}
private ObservableCollection <BindableBase> _childTabs;

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

public ParentViewModel() 
{    
    ChildTabs = new ObservableCollection <BindableBase> {
      new Child1ViewModel(),
      new Child2ViewModel()
    };
}
public ParentViewModel(IRegionManager regionManager)
{
    _regionManager = regionManager;
    _regionManager.RegisterViewWithRegion("ChildRegion", typeof(Child1View));
    _regionManager.RegisterViewWithRegion("ChildRegion", typeof(Child2View));
}
private observedcollection\u childTabs;
公共可观测集合子选项卡
{
获取{return\u childTabs;}
设置{u childTabs=value;}
}
公共ParentViewModel()
{    
ChildTabs=新的ObservableCollection{
新的Child1ViewModel(),
新的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>
<UserControl.Resources>
  <Style TargetType="TabItem">
    <Setter Property="Header"
    Value="{Binding DataContext.Title}"/>
  </Style>
</UserControl.Resources>

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


尽管如此,我仍然觉得我做错了什么,这对我来说不像是
MVVM

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

父视图模型:

public class MainMenuViewModel : BindableBase
{
    private readonly IRegionManager _regionManger;

    public MainMenuViewModel(IRegionManager regionManager)
    {
        _regionManger = regionManager;

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

    }
}
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));
    }
}
private ObservableCollection <BindableBase> _childTabs;

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

public ParentViewModel() 
{    
    ChildTabs = new ObservableCollection <BindableBase> {
      new Child1ViewModel(),
      new Child2ViewModel()
    };
}
public ParentViewModel(IRegionManager regionManager)
{
    _regionManager = regionManager;
    _regionManager.RegisterViewWithRegion("ChildRegion", typeof(Child1View));
    _regionManager.RegisterViewWithRegion("ChildRegion", typeof(Child2View));
}
父视图:

<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>
<UserControl.Resources>
  <Style TargetType="TabItem">
    <Setter Property="Header"
    Value="{Binding DataContext.Title}"/>
  </Style>
</UserControl.Resources>

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

谢谢,我会查看你对另一个问题的回答。我看过“Prism Mastering TabControl”,但发现它实际上只涵盖了所有选项卡中所有子视图都相同的情况。我还发现很难跟随他的一些视频(今年发布的除外),因为它们使用的是旧版本的prism。