棱镜父选项卡控制子区域



尝试在另一个区域内创建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));
}
}

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

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

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

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

我只想发表评论,但由于声誉低而不能发表评论。无论如何。。

检查此帖子 棱镜 7 在处理嵌套视图时引发和异常

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

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

我测试了一些其他的东西。由于我不需要动态选项卡,因此我发现这是使用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>

我最终的做法有点不同,因为我真的不需要动态添加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......

最新更新