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
添加到 BindableBase
的 ObservableCollection
。然后我使用 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>
正在尝试在另一个区域内创建 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
添加到 BindableBase
的 ObservableCollection
。然后我使用 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>