示例:WPF中如何处理TabControl页面绑定ItemsSource切换TabItem时UI数据没有持久保存的问题

一、目的:在WPF开发过程中,经常用到TabControl,也会遇到类似问题,用TabControl绑定数据源ItemsSource时,切换TabItem时,UI上的数据没有持久保存,本文介绍一种处理方式,可以做到缓存页面,只在切换TabItem时Load一次,重复切换TabItem时不会重复Load


二、实现

首先介绍遇到问题的写法

        <TabItem Header="TabControl页面数据没有缓存"><TabControl ItemsSource="{h:GetStudents Count=10}"><TabControl.Resources><BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" /><DataTemplate DataType="{x:Type h:Student}"><Grid Loaded="Grid_Loaded"><Grid.ColumnDefinitions><ColumnDefinition Width="100" /><ColumnDefinition Width="5" /><ColumnDefinition /></Grid.ColumnDefinitions><TextBox HorizontalAlignment="Stretch" /><GridSplitter Grid.Column="1"Width="5"ResizeBehavior="PreviousAndNext" /><h:Form Grid.Column="2"SelectObject="{Binding}" /></Grid></DataTemplate></TabControl.Resources><TabControl.ItemTemplate><DataTemplate><TextBlock Text="{Binding Name}" /></DataTemplate></TabControl.ItemTemplate></TabControl></TabItem>

运行效果如下:

        可以看到,Binding到后台数据的内容可以持久化保存,但是没有Binding(左侧的TextBox)或者UI上的元素(GridSplitter)的位置没有持久化保存

使用ListBox作为容器修改后的写法

        <TabItem Header="TabControl持久保存页面"><TabControl ItemsSource="{h:GetStudents Count=10}"><TabControl.Resources><BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" /><DataTemplate DataType="{x:Type h:Student}"><Grid Loaded="Grid_Loaded"><Grid.ColumnDefinitions><ColumnDefinition Width="100" /><ColumnDefinition Width="5" /><ColumnDefinition /></Grid.ColumnDefinitions><TextBox HorizontalAlignment="Stretch" /><GridSplitter Grid.Column="1"Width="5"ResizeBehavior="PreviousAndNext" /><h:Form Grid.Column="2"SelectObject="{Binding}" /></Grid></DataTemplate></TabControl.Resources><TabControl.ItemTemplate><DataTemplate><TextBlock Text="{Binding Name}" /></DataTemplate></TabControl.ItemTemplate><TabControl.ContentTemplate><DataTemplate><ListBox ItemsSource="{Binding RelativeSource={RelativeSource AncestorType=TabControl}, Path=ItemsSource}"SelectedItem="{Binding RelativeSource={RelativeSource AncestorType=TabControl}, Path=SelectedItem}"><ListBox.ItemsPanel><ItemsPanelTemplate><Grid /></ItemsPanelTemplate></ListBox.ItemsPanel><ListBox.ItemContainerStyle><Style TargetType="ListBoxItem"><Setter Property="Visibility" Value="{Binding RelativeSource={RelativeSource Mode=Self}, Path=IsSelected, Converter={StaticResource BooleanToVisibilityConverter}}" /><Setter Property="HorizontalContentAlignment" Value="Stretch" /><Setter Property="VerticalContentAlignment" Value="Stretch" /><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="ListBoxItem"><ContentPresenter /></ControlTemplate></Setter.Value></Setter></Style></ListBox.ItemContainerStyle></ListBox></DataTemplate></TabControl.ContentTemplate></TabControl></TabItem>

        相比之前的有问题的写法实际上是增加了TabControl.ContentTemplate的配置,改用ListBox,使用Grid作为ListBox的 ItemsPanel,每次切换TabItem时实际上是切换ListBox中ListBoxItem的显示和隐藏,这样就可以做到切换页面的持久化保存和Load只加载一次的效果。

运行效果如下:

五、需要了解的知识点

TabControl 样式和模板 - WPF .NET Framework | Microsoft Learn 

TabControl 类 (System.Windows.Controls) | Microsoft Learn 

ListBox 类 (System.Windows.Controls) | Microsoft Learn 

System.Windows.Controls 命名空间 | Microsoft Learn

六、源码地址

GitHub - HeBianGu/WPF-ControlDemo: 示例

GitHub - HeBianGu/WPF-ControlBase: Wpf封装的自定义控件资源库

GitHub - HeBianGu/WPF-Control: WPF轻量控件和皮肤库

七、了解更多

System.Windows.Controls 命名空间 | Microsoft Learn

https://github.com/HeBianGu

HeBianGu的个人空间-HeBianGu个人主页-哔哩哔哩视频

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

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

相关文章

什么是云服务器ecs,为什么要选择云服务器

云服务器 ECS&#xff08;Elastic Compute Service&#xff09;是阿里云&#xff08;Alibaba Cloud&#xff09;提供的一种基于云计算的虚拟服务器服务。它允许用户在云端虚拟化环境中配置和管理服务器&#xff0c;无需投资物理硬件、提高资源利用率、降低维护成本、实现快速部…

设计模式在FileBrowser中的几个应用

设计模式是代码重构的最终目标&#xff0c;在程序设计中有效的运用这项技术&#xff0c;可以大大提高代码的可读性和可维护性。使整个程序设计结构趋向精致完美。在我维护的FileBrowser模块中可以针对以下方面 应用相应的模式。 1. 使用策略模式来处理文件夹扫描操作 作为网…

Sed工具

文章目录 一、sed是什么二、sed的常用操作选项三、如何使用sed1.Sed结合正则表达式输出指定行2.增加内容3.删除4.替换5.搜索替换6.插入文件7.另存为到文件8.同时编辑9.分组操作10.读取完退出11.sed脚本12.sed的高级应用 一、sed是什么 sed 命令是利用脚本来处理文本文件。它可…

[C语言]自己实现sprintf,printf函数

一、要点&#xff1a; 实现sprintf&#xff0c;printf的要点在于不定参数的接收与处理&#xff0c;即va_list的使用&#xff0c;另外使用va_list需要包含stdarg.h头函数&#xff0c;想了解详细用法可以自行查找。 另外就是涉及数据的处理与转换&#xff0c;常用的是整型转字符…

Redis的集群的搭建

1、为什么要搭建Redis集群 Redis 集群能够提供高可用性、高性能、扩展性和数据安全性&#xff0c;适用于各种需要高速缓存和数据存储的复杂应用场景 2、Redis的集群模式 主从模式哨兵模式区中心化模式 3、主从模式 redis主从模式表示一个主节点跟若干个从节点。主节点可以…

矿井水絮凝沉淀一体机处理效果高

诸城市鑫淼环保小编带大家了解一下矿井水絮凝沉淀一体机处理效果高 矿井废水的成分主要是悬浮物和可溶性无机物&#xff0c;还含少量的废机油、乳化油、废坑木腐烂物、井下粪便等有机污染物。 悬浮物SS的特点&#xff1a;含量变化范围很大&#xff0c;可以从几百到几千甚至上万…

VMware 上安装 CentOS 7 教程 (包含网络设置)

**建议先看一些我安装VMware的教程&#xff0c;有些网络配置需要做一下 1.打开VMware&#xff0c;创建虚拟机 2.勾选自定义&#xff0c;点击下一步 3.点击下一步 4.勾选“稍后安装操作系统”&#xff0c;点击下一步 5.勾选linux&#xff0c;勾选centos7&#xff0c;点击下一步…

AH1405芯片的应用领域有哪些?sot23-5封装ic

1405芯片是一种SOT23-5封装的降压转换器&#xff0c;以其出色的性能和广泛的应用领域&#xff0c;成为电子设计中的热门选择。本文将详细介绍1405芯片的技术特点以及其在不同领域的应用情况。 技术特点 1. 宽输入电压范围 1405芯片能够接受从6V至40V的输入电压&#xff0c;这…

汽车绝缘检测详细设计

粘连检测原理 粘连检测&#xff1a; 目的&#xff1a;检测继电器、开关或电气触点是否因故障而保持在接通或断开的状态。工作原理&#xff1a; 正常操作&#xff1a;继电器或开关在正常操作时会周期性地开闭。开闭过程中会有明显的电流和电压变化。粘连状态&#xff1a;如果继…

Vuex数据持久化实现

版本&#xff1a;vue 3.4.29 vuex4.1.0 1. 出现的问题 当我使用 vuex 作为状态管理组件来存储用户的一些信息之后&#xff0c;发现从/login 页面跳转到/home 界面后拿不到vuex信息。 之后查阅资料了解&#xff0c;当切换路由后&#xff0c;vue 会重新渲染&#xff0c;而vuex 也…

实战机器学习--决策树分类器在蘑菇分类中的应用

数据集&#xff1a;https://pan.quark.cn/s/4d3526600c0c 在机器学习领域&#xff0c;图像分类是一个常见的任务&#xff0c;尤其是在自然语言处理和生物识别等领域。本文将通过一个简单的例子&#xff0c;展示如何使用Python和一些流行的库来实现蘑菇的分类&#xff0c;区分可…

docker 部署 LaTeX 环境

docker 部署 LaTeX 环境 需求表述部署步骤环境补丁&#xff08;解决 picins.sty 缺失问题&#xff09; 同步发布在个人笔记docker 部署 LaTeX 环境 需求表述 想做一个项目&#xff0c;需要一个 LaTeX 的中文环境&#xff0c;由于习惯了在服务器上用 docker 部署环境&#xff0…

pgsql的update语句在set里进行字段的运算 SET sort = sort +1

一、场景 需求&#xff1a;version 版本字段是记录数据更新的次数&#xff0c;新增时自动填充 version1 ,每更新一次数据 version就自增1。项目里单表插入和更新要手写update语句进行插入和更新。 –表中int4类型的字段 version 是1时&#xff0c;由1变成2 – version 是null…

【Linux】信号(signal)

目录 一、信号概念&#xff1a; 二、信号的常见状态&#xff1a; 信号递达&#xff1a; 信号未决&#xff1a; 阻塞信号&#xff1a; 忽略信号&#xff1a; 信号在内核中的表示&#xff1a; 三、信号相关函数&#xff1a; sigset_t &#xff08;类型&#xff09;&…

二、QGroundControl开发环境搭建

文章目录 环境列表QGC源码下载编译 环境列表 QGC GithubPX4-AutopilotQt 5.15Ubuntu20.04 QGC源码下载编译 官网下载指令 如下 // Clone the repo (or your fork) including submodules: git clone --recursive -j8 https://github.com/mavlink/qgroundcontrol.git // Upda…

Axure中继器实战篇:让数据展示和交互设计更上一层楼!

Axure中继器实战篇:让数据展示和交互设计更上一层楼! 前言 经过了前两章的学习,接下来我们去模拟的实际场景开启实战篇,以下是界面 1.前期准备 前期把页面准备好后,给中继器的每个单元格命名为了方便数据绑定的操作。 为了演示我准备了几十行数据,建议也多准备一点。…

后端返回一个图片链接,前端如何实现下载功能?

纯原创文章&#xff0c;转载请说明来源。 一、背景 要实现一个下载功能&#xff0c;后端直接返回了一个图片的地址https://xxxxx/pic.jpg。如果我们直接通过window.open(url, _blank) 的方式去下载这个图片&#xff0c;会发现 Chrome 浏览器会对这个图片进行预览&#xff0c;…

魅族手机怎么录屏?详细步骤助你轻松上手

“有人知道魅族手机怎么录屏吗&#xff0c;最近我在准备一些教学视频&#xff0c;急需用到手机的录屏功能来记录操作过程&#xff0c;但遗憾的是&#xff0c;我翻遍了设置也没能找到录屏的开关。所以&#xff0c;我在这里想问问大家&#xff0c;魅族手机是如何启动录屏功能的&a…

【PyTorch】图像多分类项目部署

【PyTorch】图像多分类项目 【PyTorch】图像多分类项目部署 如果需要在独立于训练脚本的新脚本中部署模型&#xff0c;这种情况模型和权重在内存中不存在&#xff0c;因此需要构造一个模型类的对象&#xff0c;然后将存储的权重加载到模型中。 加载模型参数&#xff0c;验证模型…

Sftp和ftp 区别、工作原理

Sftp的工作原理&#xff1a; SFTP的工作原理基于SSH协议&#xff0c;通过加密连接和安全认证来保障文件传输的安全性。 SFTP&#xff08;SSH File Transfer Protocol&#xff09;是一个确保数据在传输过程中安全的协议&#xff0c;它通过为传输的数据提供加密保护和对用户…