WPF在MVVM模式中实现为TabControl动态添加标签页

本文介绍了如何在WPF项目中使用TabControl控件创建动态标签页,通过设置TabControl的ItemsSource为ObservableCollection<TabItem>,并为每个TabItem设置UserControl视图,实现子标签页的添加和管理。
摘要由CSDN通过智能技术生成

最近在WPF项目遇到了需要使用标签页展示一些子页面的需求,搜索之后发现了TabControl控件,发现相当好用,于是在此处整理了一套(自认为)相对通用的解决方案。

标签页容器——TabControl简介

首先看微软官方文档,发现TabControl继承自ItemsControl,意味着TabControl中的子项TabItem可以通过可观测集合ObservableCollection<TabItem>进行增删,于是我们就把TabItem作为容器来放置子标签的页面。

xaml中添加TabControl并绑定到可观测集合

<Window 
        mc:Ignorable="d"
        Title="TabConWindow" Height="450" Width="800">
    <Window.DataContext>
        <local:TabConViewModel></local:TabConViewModel>
    </Window.DataContext>
    <Grid>
        <TabControl ItemsSource="{Binding TabItems}" >
            
        </TabControl>
    </Grid>
</Window>

准备标签页——为UserControl设置DataContext

设置标签页视图——为TabItemContent属性设置UserControl视图
通过实例化新的TabItem,并将一个实例化的UserControl赋值给TabItemContent属性,就实现了将UserControl的视图绑定到这个新的TabItem中。

这里我准备了两个UserControl用来测试

UserControl1.xaml

<UserControl x:Class="TestBed.Views.UserControls.UserControl1"
             xmlns:local="clr-namespace:TestBed.Views.UserControls"
             xmlns:vm="clr-namespace:TestBed.ViewModels"
             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="800">
    <UserControl.DataContext>
        <vm:HelloViewModel></vm:HelloViewModel>
    </UserControl.DataContext>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition></RowDefinition>
            <RowDefinition></RowDefinition>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition></ColumnDefinition>
            <ColumnDefinition></ColumnDefinition>
        </Grid.ColumnDefinitions>
        <TextBlock Text="{Binding Hello}"></TextBlock>
        <Button Grid.Row="1" Grid.Column="1" Command="{Binding ChangeCommand}"></Button>
    </Grid>
</UserControl>

UserControl2.xaml

<UserControl 
             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="800">
    <UserControl.DataContext>
        <vm:JojoViewModel></vm:JojoViewModel>
    </UserControl.DataContext>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition></RowDefinition>
            <RowDefinition></RowDefinition>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition></ColumnDefinition>
            <ColumnDefinition></ColumnDefinition>
        </Grid.ColumnDefinitions>
        <TextBlock Grid.Column="1" Text="{Binding Hello}"></TextBlock>
        <Button Grid.Row="1" Command="{Binding ChangeCommand}"></Button>
    </Grid>
</UserControl>

将实例化的TabItem添加到可观测集合中

public partial class TabConViewModel : ObservableObject
{
    [ObservableProperty]
    private ObservableCollection<TabItem> tabItems;

    public TabConViewModel()
    {
        tabItems = new ObservableCollection<TabItem>();
        TabItem tabItem = new TabItem();
        tabItem.Content = new UserControl1();
        TabItem tabItem2 = new TabItem();
        tabItem2.Content = new UserControl2();
        tabItems.Add(tabItem);
        tabItems.Add(tabItem2);
        tabItem.Header = "Hello1";
        tabItem2.Header = "Hello2";
    }
}

效果

在这里插入图片描述
在这里插入图片描述

结论

通过设置TabControlItemsSource属性绑定到一个ObservableCollection<TabItem>,在这个集合中增删添加了视图内容(通常用绑定了DataContextUserControl来实现)TabItem可以实现动态添加自定义的子标签页

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值