示例: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.rhkb.cn/news/385988.html

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

相关文章

矩阵管理系统有哪些功能?

在当今快节奏的数字时代&#xff0c;管理多个社交媒体账号或内容渠道可能是一项令人望而生畏的任务。这就是矩阵管理系统大显身手的地方。矩阵管理系统是一种高效的工具&#xff0c;它帮助我们轻松地管理多个内容发布点&#xff0c;就像指挥官控制着整个战场一样。下面&#xf…

C++·set与map容器(下)

本节把红黑树封装到set与map容器中去主要就是迭代器的自增自减&#xff0c;封装的大部分内容都展示到最后代码中了 1. 红黑树的改造 因为set容器只有关键码值&#xff0c;map容器中不仅要存关键码值&#xff0c;还要存关键码值对应的数据。但是红黑树只有一颗&#xff0c;我们…

【轨物方案】码头卸船机在线监测物联网解决方案

卸船机是利用连续输送机械制成能提升散粒物料的机头&#xff0c;或兼有自行取料能力&#xff0c;或配以取料、喂料装置&#xff0c;将散粒物料连续不断地提出船舱&#xff0c;然后卸载到臂架或机架并能运至岸边运输的地方送机系统去的专用机械。每年都要安排人员定期去现场巡检…

搭建DNS正向解析,反向解析+搭建DNS主从架构+搭建DNS多区域+时间同步

主要在局域网中配置&#xff0c;不存在外网 正向解析&#xff1a;域名解析为IP named.conf 解决权限 named.rfc1912.zones 解决解析方式 环境准备&#xff1a;三台机器都做下面的操作 基础配置&#xff1a;网络配置&#xff0c;关闭安全架构&#xff0c;关闭防火墙&#x…

3D模型可视化引擎HOOPS Luminate功能一览:实时渲染(二)

HOOPS Luminate是一款专为图像可视化设计的C编程工具包。它通过一个统一的集成API&#xff0c;全面覆盖了实时2D、实时3D以及照片级逼真渲染的图形功能。在处理大型数据组件的显示方面&#xff0c;HOOPS Luminate展现出了卓越的性能&#xff0c;并且具备高度的可定制性和灵活性…

一文带你读懂TCP

文章目录 1 TCP协议1.1 TCP 基础1.1.1 TCP 特性1.2.2 TCP连接数 1.2 TCP 头1.2.1 TCP 头格式1.2.2 MTU&#xff0c;MSS&#xff0c;分片传输 1.3 TCP 连接三路握手1.4 TCP 断开四次挥手1.5 SYN攻击和防范1.6 重传机制1.6.1 超时重传1.6.2 快速重传1.6.3 SACK 1.7 滑动窗口1.8 流…

VScode使用Github Copilot插件时出现read ECONNREST问题的解决方法

文章目录 read ECONNREST查看是否仍是 Copilot 会员查看控制台输出网络连接问题浏览器设置问题笔者的话 read ECONNREST 最近使用 Copilot 时一直出现 read ECONNREST 问题&#xff0c;这个表示连接被对方重置了&#xff0c;就是说在读取数据时连接被关闭。 我首先怀疑是不是…

springboo 整合 redis

springBoot 整合 redis starter启动依赖。—包含自动装配类—完成相应的装配功能。 引入依赖 <!--引入了redis整合springboot 的依赖--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis&…

PostgreSQL的pg-collector工具

PostgreSQL的pg-collector工具 pg-collector 是一个用于 PostgreSQL 数据库的监控和数据收集工具。它主要用于收集 PostgreSQL 实例的性能指标、查询统计和日志信息&#xff0c;以便进行数据库性能分析和故障排查。通过收集这些数据&#xff0c;管理员可以更好地了解数据库的运…

盘点2024年网上很火的4个语音识别转文字工具。

语音识别转文字是一项非常实用的技术&#xff0c;可以帮助我们在会议记录中省去手动记录&#xff0c;在采访中迅速得到文字稿&#xff0c;在学习中快速生成课堂笔...运用十分广泛。但是很多人不知道要怎么转换&#xff0c;在这里我便给大家介绍几款效率非常高的语音转文字的工具…

python 裁剪图片

情况&#xff1a; 有时候看视频&#xff0c;看到一个漂亮的妹子&#xff0c;按下 Alt PrintScreen 进行截图之后&#xff0c;会把整个屏幕都截图。 需要适当剪裁一下。 每次打开 PS &#xff0c; 也太慢了。 所以写个代码&#xff0c; 快速处理。 效果对比&#xff1a; 原始…

轨道式智能巡检机器人,助力综合管廊安全运维

1 引言 当前城市综合管廊建设已经成为世界范围内的发展趋势&#xff0c;2017年5月住建部、发改委联合发布《全国城市市政基础设施建设“十三五”规划》&#xff0c;截至2017年4月底国内地下综合管廊试点项目已开工建设687 km&#xff0c;建成廊体260 km&#xff0c;完成投资40…

MSSQL注入前置知识

简述 Microsoft SQL server也叫SQL server / MSSQL&#xff0c;由微软推出的关系型数据库&#xff0c;默认端口1433 常见搭配C# / .net IISmssql mssql的数据库文件 数据文件&#xff08;.mdf&#xff09;&#xff1a;主要的数据文件&#xff0c;包含数据表中的数据和对象信息…

使用update-alternatives管理GCC版本

使用update-alternatives管理GCC版本 简介操作过程 简介 当操作系统中存在多个版本的GCC时&#xff0c;可以使用使用update-alternatives管理默认使用的编译器版本。 本文使用gcc-9和gcc-11做演示&#xff0c;操作系统为ubuntu-20.04 操作过程 ①使用以下命令确认gcc已正确…

Ubuntu22.04重装系统+基础配置

重装系统 note&#xff1a;备份数据&#xff0c;重装系统后home下的文件会丢失&#xff0c;所以先备份一下home的数据到其他的盘/mnt/下里。记住之前系统的DNS&#xff0c;IP和掩码。 先在Ubuntu官网下载22.04桌面版&#xff08;种子链接要用迅雷下载&#xff09;。但是版本还…

橙单前端项目下载编译遇到的问题与解决

今天下载orange-admin前端项目&#xff0c;不过下载下来运行也出现一些问题。 1、运行出现下面一堆错误&#xff0c;如下&#xff1a; 2、对于下面这个错误 error Expected linebreaks to be LF but found CRLF linebreak-style 这就是eslint的报错了&#xff0c;可能是原作者…

隆尧县“隆品佳尧”区域公用品牌发布推介会暨地标之都七月选品会成功举办

在国家乡村振兴战略与农业现代化建设的大背景下&#xff0c;隆尧县凭借其得天独厚的地理优势和丰富的自然资源&#xff0c;正在成为区域经济与品牌建设的一颗新星。为了进一步推动隆尧县的农业发展和乡村建设&#xff0c;由隆尧县商务局指导、隆尧县电子商务公共服务中心主办的…

【leetcode 详解】生成特殊数字的最少操作【中等】(C++思路精析)

题目见下&#xff1a; 测试数据: 解题思路笔记&#xff1a; 最初拿到这道题是很蒙的&#xff0c;联想不到什么数据结构的模型&#xff08;肯定是笔者积累太少了&#xff09;&#xff0c;甚至惯性地想怎么实现“删除数字”的操作&#xff1a;在原字符串中抽出一个字符然后将剩…

南非云手机:助力企业在南非的商业活动

中国企业在南非的商业活动涵盖了多个领域&#xff0c;包括基础设施建设、采矿业、制造业、能源、电信、金融服务等。随着中国企业在南非的不断扩展&#xff0c;如何高效管理业务和保护数据安全成为了重要课题&#xff0c;而南非云手机为企业提供了强大的技术支持和便利的管理工…

神经网络与注意力机制的权重学习对比:公式探索

神经网络与注意力机制的权重学习对比&#xff1a;公式探索 注意力机制与神经网络权重学习的核心差异 在探讨神经网络与注意力机制的权重学习时&#xff0c;一个核心差异在于它们如何处理输入数据的权重。神经网络通常通过反向传播算法学习权重&#xff0c;而注意力机制则通过学…