微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

棱镜父TabControl子区域

如何解决棱镜父TabControl子区域

尝试在另一个区域内创建一个TabControl区域。 TabControl具有一组将要添加到其中的Views,并带有各自的viewmodels

但是没有显示View,没有显示tabitem,而只显示一个View,或者出现了以下错误

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

MainMenuView:

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

MainMenuviewmodel:

public class MainMenuviewmodel : BindableBase
{
    private readonly IRegionManager _regionmanger;

    public MainMenuviewmodel(IRegionManager regionManager)
    {
        _regionmanger = regionManager;

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

    }
}

ParentView:

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

Parentviewmodel:

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));
    }
}

在所有视图中我也都有棱镜命名空间:

xmlns:prism="http://prismlibrary.com/"
prism:viewmodelLocator.AutoWireviewmodel="True"

也许我没有以某种方式注册ParentTabRegion?但是我不必注册其他区域,它们似乎可以立即使用。

让我知道您是否知道我在做错什么,或者我缺少什么。谢谢。

解决方法

我只想发表评论,但由于声誉低下而不能。反正..

查看此帖子 Prism 7 throws and exception when working with nested views

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

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

,

由于我并不需要动态添加Tabs,因此我做了一些不同的事情。

所以我最终要做的只是将所有ViewModels添加到ObservableCollection的{​​{1}}中。然后,我使用BindableBase将它们添加到视图中。

父级ViewModel:

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> 并不像...

,

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

父级ViewModel:

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>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。