簡體   English   中英

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

我在所有視圖中也有棱鏡命名空間:

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添加到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 ......

我測試了一些其他的東西。 由於我不需要動態選項卡,我發現這是使用 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM