简体   繁体   English

TabControl中的WPF MVVM多个ContentControls

[英]WPF MVVM Multiple ContentControls in TabControl

I want my tabitem to display multiple usercontrols in a grid fashion. 我希望我的tabitem以网格形式显示多个usercontrols Imagine having a grid in a single tabitem where the first row and the second row contains corresponding usercontrol1 and usercontrol2 . 想象一下在一个tabitem中有一个grid ,其中第一行和第二行包含相应的usercontrol1usercontrol2 ViewModels for these user controls are View1Model.cs and View2Model.cs . 这些用户控件的ViewModel是View1Model.csView2Model.cs

I can currently display a single usercontrol using the following method: 我目前可以使用以下方法显示单个usercontrol

Code for View.xaml : View.xaml代码:

<TabControl.ItemTemplate>
    <DataTemplate>
        <TextBlock Text="{Binding Header}"/>
    </DataTemplate>
</TabControl.ItemTemplate>
<TabControl.ContentTemplate>
    <DataTemplate>
        <ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto">
            <ContentControl Content="{Binding Content}" />
        </ScrollViewer>
    </DataTemplate>
</TabControl.ContentTemplate>

Code for ViewModel.cs : ViewModel.cs代码:

public ObservableCollection<TabItem> Tabs { get; set; }

public ToolViewModel ()
{
    Tabs = new ObservableCollection<TabItem>();
    Tabs.Add(new TabItem { Header = "Header", Content = new View1Model()});
}

Code for TabItem.cs (model): TabItem.cs代码(模型):

public string Header { get; set; }
public ViewModelBase Content { get; set; }

Obviously, I can't add another one ContentControl to the same Header in this way. 显然,我不能以这种方式将另一个ContentControl添加到同一Header To solve the problem, I suppose I should firstly change public ViewModelBase Content { get; set; } 为了解决该问题,我想我应该首先更改public ViewModelBase Content { get; set; } public ViewModelBase Content { get; set; } public ViewModelBase Content { get; set; } to public ViewModelBase[] Content { get; set; } public ViewModelBase Content { get; set; }public ViewModelBase[] Content { get; set; } public ViewModelBase[] Content { get; set; } public ViewModelBase[] Content { get; set; } . public ViewModelBase[] Content { get; set; } However, I am not sure how I should display a list of ContentControl in xaml. 但是,我不确定如何在xaml中显示ContentControl的列表。

EDIT: I ended up using ObservableCollection<ViewModelBase> instead of simple arrays. 编辑:我最终使用ObservableCollection<ViewModelBase>而不是简单的数组。

To solve the problem, I suppose I should firstly change public ViewModelBase Content { get; set; } 为了解决该问题,我想我应该首先更改public ViewModelBase Content { get; set; } public ViewModelBase Content { get; set; } public ViewModelBase Content { get; set; } to public ViewModelBase[] Content { get; set; } public ViewModelBase Content { get; set; }public ViewModelBase[] Content { get; set; } public ViewModelBase[] Content { get; set; } public ViewModelBase[] Content { get; set; } . public ViewModelBase[] Content { get; set; } However, I am not sure how I should display a list of ContentControl in xaml. 但是,我不确定如何在xaml中显示ContentControl的列表。

Use an ItemsControl : 使用ItemsControl

<TabControl.ContentTemplate>
    <DataTemplate>
        <ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto">
            <ItemsControl ItemsSource="{Binding Content}" />
        </ScrollViewer>
    </DataTemplate>
</TabControl.ContentTemplate>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM