如何解决棱镜父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 举报,一经查实,本站将立刻删除。