WPF MVVM入门系列教程(TabControl绑定到列表并单独指定每一页内容)

在以前的开发过程中,对于TabControl控件,我一般是习惯直接定义TabItem,在TabItem下布局,并进行绑定。

类似这样

 1  <TabControl ItemsSource="{Binding TabList}" SelectedIndex="0">2      <TabItem Header="Tab1">3           <Grid>4               <Label Content="{Binding  XXX}"/>5           </Grid>6      </TabItem>7      <TabItem Header="Tab2">8           <Grid>9               <Button Content="{Binding  XXX}" Command="{Binding XXX}"/>
10           </Grid>
11      </TabItem>
12  </TabControl>    

我们也可以单独定义每一个Tab页的ViewModel和布局。

1、创建一个Tab页公用的ViewModel

这个类用于显示Tab页的标题等公共属性。

 1     public class TabViewModel : ObservableObject2     {3         private string headerName;4 5         public string HeaderName 6         { 7             get => headerName; 8             set => SetProperty(ref headerName,value); 9         }
10     }

2、定义每一个Tab页的ViewModel

假设我这里是设置两页,TabATabB

TabA显示一个详情文本

TabB显示一个图片

TabToolAViewModel.cs

 1     public class TabToolAViewModel : TabViewModel2     {3         private string detail;4         public string Detail { get => detail; set => SetProperty(ref detail,value); }5 6         public TabToolAViewModel()7         {8             HeaderName = "工具A";9         }
10 
11     }

TabToolBViewModel.cs

 1     public class TabToolBViewModel : TabViewModel2     {3         private string imagePath;4         public string ImagePath { get => imagePath; set => SetProperty(ref imagePath,value); }5 6         public TabToolBViewModel()7         {8             HeaderName = "工具B";9         }
10 
11     }

3、创建主界面

MainWindow.xaml

 1 <Window x:Class="WPFTabMVVMDemo.MainWindow"2         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"3         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"4         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"5         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"6         mc:Ignorable="d"7         Title="MainWindow" Height="450" Width="800">8     <TabControl ItemsSource="{Binding TabList}" SelectedIndex="0">9         <TabControl.ItemTemplate>
10             <DataTemplate>
11                 <ContentPresenter Content="{Binding HeaderName}"></ContentPresenter>
12             </DataTemplate>
13         </TabControl.ItemTemplate>
14     </TabControl>
15 </Window>

4、创建主界面的ViewModel

MainWindowViewModel.cs

 1  public class MainWindowViewModel : ObservableObject2  {3      private ObservableCollection<TabViewModel> tabList = new ObservableCollection<TabViewModel>();4 5      public ObservableCollection<TabViewModel> TabList { get => tabList; set => SetProperty(ref tabList,value); }6 7      public MainWindowViewModel()8      {9          tabList.Add(new TabToolAViewModel() {Detail = "详情...." });
10          tabList.Add(new TabToolBViewModel() { ImagePath = "https://img2.baidu.com/it/u=3115165460,1153722234&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=750" });
11      }
12 
13  }

我们将MainWindowViewModel.cs绑定到MainWindow上后

1  public MainWindow()
2  {
3      InitializeComponent();
4 
5      this.DataContext = new MainWindowViewModel();
6  }

运行效果如下:

可以看到这里显示的是TabToolAViewModel的字样,因为这里TabToolAViewModel并没有对应到具体的View上面。

5、创建单独的视图

接下来我们就可以单独的创建每个Tab页要显示的内容了

TabAView.xaml

TabA显示一个详情文本

 1 <UserControl x:Class="WPFTabMVVMDemo.Views.ToolAView"2              xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"3              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"4              xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 5              xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 6              xmlns:local="clr-namespace:WPFTabMVVMDemo.Views"7              mc:Ignorable="d" 8              d:DesignHeight="450" d:DesignWidth="800">9     <StackPanel>
10         <Label Content="{Binding Detail}"></Label>
11     </StackPanel>
12 </UserControl>

TabBView.xaml

TabB显示一个图片

 1 <UserControl x:Class="WPFTabMVVMDemo.Views.ToolBView"2              xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"3              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"4              xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 5              xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 6              xmlns:local="clr-namespace:WPFTabMVVMDemo.Views"7              mc:Ignorable="d" 8              d:DesignHeight="450" d:DesignWidth="800">9     <Grid>
10         <Image Source="{Binding ImagePath}"></Image>   
11     </Grid>
12 </UserControl>

6、创建视图和ViewModel的映射

有了两个单独的视图以后,如何将它和它们对应的ViewModel绑定起来呢?

此时我们可以创建一个资源字典,并定义数据模板,用于ViewModelView的映射 

ViewTemplate.xaml

 1 <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"2                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:view="clr-namespace:WPFTabMVVMDemo.Views"3                     xmlns:local="clr-namespace:WPFTabMVVMDemo">4 5     <DataTemplate 6      DataType="{x:Type 7          local:TabToolAViewModel}">8         <view:ToolAView></view:ToolAView>9     </DataTemplate>
10     
11     <DataTemplate 
12 DataType="{x:Type 
13     local:TabToolBViewModel}">
14         <view:ToolBView></view:ToolBView>
15     </DataTemplate>
16 </ResourceDictionary>

7、使用视图和ViewModel的映射 

然后在需要使用的地方,引用 这个资源字典就可以了。

我们这里是在主窗口中使用

就在MainWindow.xml中添加如下引用 

1   <Window.Resources>
2       <ResourceDictionary Source="ViewTemplate.xaml"></ResourceDictionary>
3   </Window.Resources>

添加后,运行效果如下:

这样我们就可以将TabControl绑定到一个列表,并单独指定每一个Tab页的标题和内容。

示例代码

下载

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/94391.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/94391.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

L2CAP 面向连接信道(CoC)在 BLE 中的应用:建立、流控与数据传输

在物联网(IoT)蓬勃发展的今天,低功耗蓝牙(BLE)技术因其高效节能、低成本等特性,成为短距离无线通信的首选方案。作为 BLE 协议栈的核心组件,逻辑链路控制与适配协议(L2CAP)的面向连接信道(CoC)承担着数据传输的关键任务。本文将深入解析 L2CAP CoC 在 BLE 中的应用,…

医疗AI与医院数据仓库的智能化升级:异构采集、精准评估与高效交互的融合方向(上)

摘要: 随着医疗信息化建设的深入,医院数据仓库(Data Warehouse, DW)作为医疗AI应用的核心数据底座,其效能直接决定智能化转型的深度与广度。本文聚焦医疗AI驱动下医院数据仓库的三大关键升级功能——异构采集支持数据库体检与智能SQL分析、评估引擎重构实现六大数据库精准…

2015-2018年咸海流域1km归一化植被指数8天合成数据集

数据集摘要数据集包含2015年-2018年咸海流域NDVI 8天均值数据。提取美国国家航空航天局中分辨率成像光谱仪MOD13A2产品第一波段作为归一化植被指数数据&#xff0c;乘以比例因子0.0001&#xff0c;叠加咸海流域边界数据&#xff0c;裁切后得到咸海流域范围内的NDVI月均值数据。…

Kafka消息持久化机制全解析:存储原理与实战场景

目录 引言​ 一、Kafka消息持久化的核心目标 二、底层存储机制深度剖析 1.【文件系统分层】——日志分组 日志段 核心结构 示例目录结构 2.【消息写入流程】——从内存到磁盘的旅程✈️ 3.【默认存储参数】——生产环境的黄金比例 三、典型应用场景与案例实战 案例1…

Python训练营打卡Day41-Grad-CAM与Hook函数

知识点回顾回调函数lambda函数hook函数的模块钩子和张量钩子Grad-CAM的示例 作业&#xff1a;理解下今天的代码即可 在深度学习中&#xff0c;我们经常需要查看或修改模型中间层的输出或梯度。然而&#xff0c;标准的前向传播和反向传播过程通常是一个黑盒&#xff0c;我们很难…

使用VBA宏批量修改Word中表格题注格式

目录&#x1f4c2; 使用步骤✅ 方式一&#xff1a;应用已有样式&#xff08;推荐&#xff09;代码实现说明✅ 方式二&#xff1a;手动设置字体格式&#xff08;无需预定义样式&#xff09;代码实现参数说明如何运行宏&#xff1f;补充建议总结在撰写论文、技术文档或报告时&…

Redis面试精讲 Day 27:Redis 7.0/8.0新特性深度解析

【Redis面试精讲 Day 27】Redis 7.0/8.0新特性深度解析 在“Redis面试精讲”系列的第27天&#xff0c;我们将聚焦Redis最新版本——7.0与8.0的核心新特性。随着Redis从内存数据库向云原生、高可用、高性能中间件持续演进&#xff0c;7.0和8.0版本引入了多项颠覆性改进&#xf…

使用自制的NTC测量模块测试Plecs的热仿真效果

之前构建的 NTC 温度测量模型是进行 PLECS 热仿真的完美起点和核心组成部分。 PLECS 的强大之处在于它能够进行多域仿真,特别是电-热联合仿真。您可以将电路仿真(包括您的 NTC 测量模型)与热仿真(散热器、热容、热阻等)无缝地结合起来。 电-热联合仿真原理 整个仿真闭环…

C语言初学者笔记【动态内存管理】

、 文章目录一、为什么需要动态内存分配&#xff1f;二、malloc 和 free1. malloc2. free三、calloc 和 realloc1. calloc2. realloc四、常见的动态内存错误1. 对 NULL 解引用2. 越界访问3. 对非动态内存使用 free4. 释放部分动态内存5. 多次释放同一块内存6. 内存泄漏五、动态…

AI模型部署 - 大语言模型(LLM)部署技术与框架

目录 一、 大语言模型部署的核心挑战与关键技术 二、 主流开源部署框架深度解析 2.1. Ollama:本地部署的极简主义者 2.2. Hugging Face TGI (Text Generation Inference) 2.3. vLLM:为吞吐量而生 2.4. sglang:面向复杂提示与结构化输出的革新者 三、 特定硬件与云平台…

Windows11 GeForce GTX 1060 CUDA+CUDNN+Pytorch 下载及安装

一、查看显卡型号信息 系统&#xff1a;Windows11 显卡&#xff1a;GeForce GTX 1060 型号&#xff1a; &#xff08;1&#xff09;搜索 NVIDIA&#xff0c;选择 NVIDIA Control Panel&#xff08;2&#xff09;打开 NVIDIA control Panel&#xff0c;打开系统信息&#xff0c;…

在通义灵码中配置MCP服务

目录 查找mcp列表 通义灵码中配置MCP 使用方式 STDIO (Standard Input/Output) 组成部分&#xff1a; SSE (Server-Sent Events) 特点&#xff1a; 主要区别对比 配置方式 配置优先级 个人设置 项目设置 验证 通过MCP调用高德地图 查找mcp列表 打开ModelScope - …

网络中的IO问题(五种常见的IO方式)

什么是高效的IO&#xff1f; 正常情况下&#xff0c;IO等拷贝 高效的IO拷贝&#xff08;即让IO尽量不等&#xff09; 为什么我们平常玩电脑的时候&#xff0c;感觉不到等待的过程呢&#xff1f; 任何通信场景&#xff0c;IO通信场景&#xff0c;效率一定是有上限的. 花盆里&am…

JAVA核心基础篇-修饰符

Java 修饰符主要用于定义类、方法或变量&#xff0c;通常放在语句的最前端&#xff0c;可分为访问修饰符和非访问修饰符两类。一、访问修饰符public&#xff1a;对所有类可见&#xff0c;可用于类、接口、变量和方法。被声明为 public 的类、方法、构造方法和接口能够被任何其他…

笔试——Day46

文章目录第一题题目思路代码第二题题目思路代码第三题题目思路代码第一题 题目 AOE还是单体&#xff1f; 思路 贪心 剩余怪物数量 >x时&#xff0c;使用AOE&#xff1b;否则使用单体 代码 #include <iostream> #include <algorithm> using namespace std;…

零工合规挑战:盖雅以智能安全体系重构企业用工风控

国家税务总局发布的2025年第15号公告&#xff0c;将多种互联网平台企业纳入涉税信息报送范围&#xff0c;这让灵活用工平台的数据和网络安全问题成为行业关注的焦点。在海量零工信息和企业数据流转的过程中&#xff0c;数据泄露和网络攻击的风险不断上升&#xff0c;迫使平台在…

非线性规划学习笔记

非线性规划学习笔记 一、非线性规划的应用 非线性规划&#xff08;Nonlinear Programming, NLP&#xff09;在很多领域都有重要应用&#xff0c;主要包括&#xff1a; 工程设计优化&#xff1a;结构优化、电路参数优化、交通线路设计经济与管理&#xff1a;投资组合优化、生产计…

网络模型深度解析:CNI、Pod通信与NetworkPolicy

目录 专栏介绍 作者与平台 您将学到什么&#xff1f; 学习特色 网络模型深度解析&#xff1a;CNI、Pod通信与NetworkPolicy 第一部分&#xff1a;CNI 插件原理 - 网络基础设施的构建者 1.1 CNI 规范&#xff1a;标准化网络接入的基石 1.2 Flannel&#xff1a;简单高效的…

数据结构青铜到王者第二话---数据结构基本常识(2)

续接上一话 一、包装类 在Java中&#xff0c;由于基本类型不是继承自Object&#xff0c;为了在泛型代码中可以支持基本类型&#xff0c;Java给每个基本类型都对应了一个包装类型。 1、基本数据类型和对应的包装类 除了 Integer 和 Character&#xff0c; 其余基本类型的包装类…

fastdds qos:DeadlineQosPolicy

1含义DeadlineQosPolicy这种qos使用在DataWriter、DataReader、Topic。该qos用来监督数据是不是按照预期的频率进行收发。假如数据是周期性发送和接收&#xff0c;周期是固定的100ms&#xff0c;我们如果想要监督数据收发是不是按照预期的周期进行的&#xff0c;那么就可以配置…