![](/img/trans.png)
[英]Prism MVVM - Add child View to parent View without using Regions and Injection, just XAML
[英]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));
}
}
我在所有視圖中也有棱鏡命名空間:
xmlns:prism="http://prismlibrary.com/"
prism:ViewModelLocator.AutoWireViewModel="True"
也許我沒有以某種方式注冊ParentTabRegion
? 但我不必注冊其他區域,它們似乎開箱即用。
如果您知道我做錯了什么或者我遺漏了什么,請告訴我。 謝謝你。
我只想發表評論,但由於聲譽低而不能發表評論。 反正..
使用嵌套視圖時,檢查這篇文章Prism 7 throws and exception
正如評論中所述:“問題在於如何在 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>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.