WPF的IValueConverter用于校验和格式化TextBox的数字输入
在数据绑定(Data Binding)的上下文中,我们经常使用继承 IValueConverter 接口的类,用于在源值和目标值之间进行转换。该接口定义了两个方法:Convert 和 ConvertBack,这两个方法分别用于从源值到目标值的转换和从目标值回到源值的转换(如果绑定支持双向绑定)。
TextBox 控件的 UpdateSourceTrigger 属性用于控制何时更新绑定源的值,它有以下4个可选值:
PropertyChanged:当TextBox的内容发生任何变化时,都会更新绑定源。这是默认值,提供了即时反馈,但可能会增加应用程序的负载,因为每次击键都会触发更新。主要用于实时校验文本输入。LostFocus:当TextBox失去焦点时,更新绑定源。这减少了不必要的更新,但可能意味着在用户完成输入之前,绑定源的值不会反映最新的更改。Explicit:不会自动更新绑定源。你需要显式调用BindingExpression的UpdateSource方法来更新绑定源。Default:使用绑定目标的默认UpdateSourceTrigger值。对于TextBox,这通常是PropertyChanged。
TextBox 控件的绑定模式(Mode)通常不是 TextBox 控件本身的直接属性,而是与数据绑定(Data Binding)相关的属性。当在 TextBox 的 Text 属性上使用数据绑定时,有时需要设置 Binding 对象的 Mode 属性来控制数据的流动方向。它有如下5个可选值:
-
OneWay:这是单向绑定的默认模式。当源属性的值改变时,目标属性(即
TextBox的Text属性)的值会自动更新。但是,对目标属性的更改不会传播回源属性。 -
TwoWay:这是双向绑定的模式。当源属性或目标属性的值改变时,另一个属性的值也会自动更新。在
TextBox的上下文中,这意味着当你在文本框中输入文本时,绑定的源属性会更新;同样地,如果源属性的值在代码中被改变,文本框中的内容也会更新。 -
OneWayToSource:这是另一种单向绑定模式,但与
OneWay相反。在这种模式下,当目标属性(TextBox的Text属性)的值改变时,源属性的值也会更新,但源属性的变化不会影响到目标属性。 -
OneTime:在这种模式下,数据只在绑定时从源传输到目标一次。之后,源属性的变化不会反映到目标属性上,并且目标属性的变化也不会尝试回写到源属性。
-
Default:这表示使用绑定目标的默认模式。对于
TextBox的Text属性,默认模式通常是TwoWay,但这也可能取决于具体的绑定上下文和父控件的设置。
如下xaml页面中,左边的TextBox使用Converter属性,绑定值转换器,右边的则没有。
<Window x:Class="TextConverterTest.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="clr-namespace:TextConverterTest"mc:Ignorable="d"Title="MainWindow" Height="450" Width="800"><Window.Resources><local:NumericToStringConverter x:Key="NToSConverter"/><Style TargetType="TextBox"><Setter Property="Height" Value="80"></Setter><Setter Property="Width" Value="180"></Setter><Setter Property="HorizontalContentAlignment" Value="Center"></Setter><Setter Property="VerticalContentAlignment" Value="Center"></Setter><Setter Property="FontSize" Value="20"></Setter></Style></Window.Resources><Grid Height="100" Width="400"><Grid.RowDefinitions><RowDefinition></RowDefinition></Grid.RowDefinitions><Grid.ColumnDefinitions><ColumnDefinition></ColumnDefinition><ColumnDefinition></ColumnDefinition></Grid.ColumnDefinitions><TextBox Grid.Row="0" Grid.Column="0" Text="{Binding Path=TextBoxLeftStr, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource NToSConverter}}"></TextBox><TextBox Grid.Row="0" Grid.Column="1" Text="{Binding Path=TextBoxRightStr, Mode=TwoWay}, UpdateSourceTrigger=PropertyChanged"></TextBox></Grid>
</Window>
添加TextBox的Path绑定的字段属性。在构造函数中,必须要有【DataContext = this;】这行代码,用于获取或设置元素参与数据绑定时的数据上下文。
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{public string TextBoxLeftStr { get; set; }public string TextBoxRightStr { get; set; }public MainWindow(){InitializeComponent();DataContext = this;//必须要有,关联上下文}
}
IValueConverter接口的具体实现:
public class NumericToStringConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{try{if (value == null || string.IsNullOrEmpty(value.ToString())){return "";}else if (value.ToString().Last() == '.'){return value.ToString();}decimal decimalValue = System.Convert.ToDecimal(value);string format = decimalValue % 1 == 0 ? "0" : "0.0"; // 如果小数部分为0则不显示小数,否则显示一位小数 return decimalValue.ToString(format, CultureInfo.InvariantCulture);}catch (Exception ex){MessageBox.Show(ex.Message);return "";}
}// ConvertBack方法可能不需要,因为通常TextBox到数值的转换是单向的
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{try{if (value == null || string.IsNullOrEmpty(value.ToString())){return "";}else if (value.ToString().Last() == '.'){return value.ToString();}decimal decimalValue = System.Convert.ToDecimal(value);string format = decimalValue % 1 == 0 ? "0" : "0.0"; // 如果小数部分为0则不显示小数,否则显示一位小数 return decimalValue.ToString(format, CultureInfo.InvariantCulture);}catch (Exception ex){MessageBox.Show(ex.Message);return "";}
}
}
在xaml中引入资源类:
<Window.Resources><local:NumericToStringConverter x:Key="NToSConverter"/>
</Window.Resources>
实现效果:左TextBox最多只能输入1位小数。且左右两个TextBox均不能输入除数字和小数点以外的字符。

相关文章:
WPF的IValueConverter用于校验和格式化TextBox的数字输入
在数据绑定(Data Binding)的上下文中,我们经常使用继承 IValueConverter 接口的类,用于在源值和目标值之间进行转换。该接口定义了两个方法:Convert 和 ConvertBack,这两个方法分别用于从源值到目标值的转换…...
SQL Server的守护神:Always On 高可用性详解
🛡️ SQL Server的守护神:Always On 高可用性详解 在企业级应用中,数据的可用性和业务连续性至关重要。SQL Server的Always On功能提供了一个高可用性解决方案,确保数据库服务的持续运行和快速故障恢复。本文将详细解释SQL Serve…...
Eureka入门
Eureka是一种服务发现工具,广泛应用于微服务架构中。它主要由Netflix开源,帮助服务在分布式系统中自动注册和发现。以下是Eureka的基本入门指南。 前提条件 在开始之前,确保你已经安装了以下软件: JDK 8或更高版本Maven或Gradl…...
高阶面试-netty部分
介绍下netty Netty 是一个基于 Java 的异步事件驱动的网络应用框架,提供了用于快速开发高性能、高可扩展性的协议服务器和客户端的工具 BIO、NIO、AIO 的区别是什么 BIO blocking io,同步阻塞IO,比较简单,为每个请求分配一个线…...
在 C++的跨平台开发中,如何处理不同操作系统和编译器之间的细微差异,以确保程序能够稳定且高效地运行?
在 C 的跨平台开发中,处理不同操作系统和编译器之间的细微差异是非常重要的。以下是一些处理差异的技巧: 使用条件编译:使用预处理指令,根据不同的操作系统和编译器来编写不同的代码。 #if defined(_WIN32)// Windows 特定代码 …...
独孤思维:脑子不好使,副业稳赚钱
01 副业,贴身级模仿。 比如独孤最近在测试dy虚拟资料项目。 跑了三个多月。 赚了点下小钱。 从最开始的自动生成视频,到后来的抽帧优化,再到先做的矩阵玩法。 一直都在迭代。 是独孤脑子好使吗? 恰恰相反。 正式因为独孤…...
【数据结构】(C语言):二叉搜索树
二叉搜索树: 树不是线性的,是层级结构。基本单位是节点,每个节点最多2个子节点。有序。每个节点,其左子节点都比它小,其右子节点都比它大。每个子树都是一个二叉搜索树。每个节点及其所有子节点形成子树。可以是空树。…...
泛微开发修炼之旅--23基于ecology自研的数据库分页组件(分页组件支持mysql、sqlserver、oracle、达梦等)
一、使用场景 ecology二开开发过程中,经常要使用到分页查询,随着信创项目的到来,各种国产数据库的出现,对于数据库分页查询兼容何种数据库,就迫在眉睫。 于是,我自己基于ecology开发了一个分页插件&#…...
《昇思25天学习打卡营第4天 | mindspore Transforms 数据变换常见用法》
1. 背景: 使用 mindspore 学习神经网络,打卡第四天; 2. 训练的内容: 使用 mindspore 的常见的数据变换 Transforms 的使用方法; 3. 常见的用法小节: 支持一系列常用的 Transforms 的操作 3.1 Vision …...
【Python时序预测系列】基于LSTM实现多输入多输出单步预测(案例+源码)
这是我的第312篇原创文章。 一、引言 单站点多变量输入多变量输出单步预测问题----基于LSTM实现。 多输入就是输入多个特征变量 多输出就是同时预测出多个标签的结果 单步就是利用过去N天预测未来1天的结果 二、实现过程 2.1 读取数据集 dfpd.read_csv("data.csv&qu…...
git客户端工具之Github,适用于windows和mac
对于我本人,我已经习惯了使用Github Desktop,不同的公司使用的代码管理平台不一样,就好奇Github Desktop是不是也适用于其他平台,结果是可以的。 一、克隆代码 File --> Clone repository… 选择第三种URL方式,输入url &…...
ai除安卓手机版APP软件一键操作自动渲染去擦消稀缺资源下载
安卓手机版:点击下载 苹果手机版:点击下载 电脑版(支持Mac和Windows):点击下载 一款全新的AI除安卓手机版APP,一键操作,轻松实现自动渲染和去擦消效果,稀缺资源下载 1、一键操作&…...
Unity获取剪切板内容粘贴板图片文件文字
最近做了一个发送消息的unity项目,需要访问剪切板里面的图片文字文件等,翻遍了网上的东西,看了不是需要导入System.Windows.Forms(关键导入了unity还不好用,只能用在纯c#项目中),所以我看了下py…...
利用谷歌云serverless代码托管服务Cloud Functions构建Gemini Pro API
谷歌在2024年4月发布了全新一代的多模态模型Gemini 1.5 Pro,Gemini 1.5 Pro不仅能够生成创意文本和代码,还能理解、总结上传的图片、视频和音频内容,并且支持高达100万tokens的上下文。在多个基准测试中表现优异,性能超越了ChatGP…...
极狐GitLab 17.0 重磅发布,100+ DevSecOps功能更新来啦~【一】
GitLab 是一个全球知名的一体化 DevOps 平台,很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab :https://gitlab.cn/install?channelcontent&utm_sourcecsdn 是 GitLab 在中国的发行版,专门为中国程序员服务。可以一键式部署…...
python实现符文加、解密
在历史悠久的加密技术中,恺撒密码以其简单却有效的原理闻名。通过固定的字母位移,明文可以被转换成密文,而解密则是逆向操作。这种技术不仅适用于英文字母,还可以扩展到其他语言的字符体系,如日语的平假名或汉语的拼音…...
【解释】i.MX6ULL_IO_电气属性说明
【解释】i.MX6ULL_IO_电气属性说明 文章目录 1 Hyst1.1 迟滞(Hysteresis)是什么?1.2 GPIO的Hyst. Enable Field 参数1.3 应用场景 2 Pull / Keep Select Field2.1 PUE_0_Keeper — Keeper2.2 PUE_1_Pull — Pull2.3 选择Keeper还是Pull 3 Dr…...
02-《石莲》
石 莲 石莲(学名:Sinocrassula indica A.Berger),别名因地卡,为二年生草本植物,全株无毛,具须根。花茎高15-60厘米,直立,常被微乳头状突起。茎生叶互生,宽倒披…...
MySQL之聚簇索引和非聚簇索引
1、什么是聚簇索引和非聚簇索引? 聚簇索引,通常也叫聚集索引。 非聚簇索引,指的是二级索引。 下面看一下它们的含义: 1.1、聚集索引选取规则 如果存在主键,主键索引就是聚集索引。如果不存在主键,将使…...
Web后端开发之前后端交互
http协议 http ● 超文本传输协议 (HyperText Transfer Protocol)服务器传输超文本到本地浏览器的传送协议 是互联网上应用最为流行的一种网络协议,用于定义客户端浏览器和服务器之间交换数据的过程。 HTTP是一个基于TCP/IP通信协议来传递数据. HTT…...
OpenClaw定时任务管理:千问3.5-27B驱动日报自动生成
OpenClaw定时任务管理:千问3.5-27B驱动日报自动生成 1. 为什么需要自动化日报 每周五下午,我都会陷入一种"汇报焦虑"——要手动整理GitHub提交记录、汇总JIRA任务进度、编写本周技术总结。这个过程通常要花费1-2小时,而且内容模板…...
3分钟终极指南:如何永久冻结IDM试用期实现免费使用
3分钟终极指南:如何永久冻结IDM试用期实现免费使用 【免费下载链接】IDM-Activation-Script IDM Activation & Trail Reset Script 项目地址: https://gitcode.com/gh_mirrors/id/IDM-Activation-Script Internet Download Manager(IDM&#…...
暑期实习面经记录(十四)(java)(4.2号补充下,闪闪改改)
本人最近面的被问的比较多的java八股先完成再完美1.如何设计一个扣减库存或者说秒杀抢券系统2.最近问这个问的比较多多线程->线程池->并发安全->场景2.锁->synconiezed,retranlock->可重入吗->怎么实现的2.1读写锁 怎么实现的;AQS底层;…...
DNMSI2C轻量级声级计驱动库:IEC标准SPL数据采集
1. 项目概述DNMSI2C 是一款专为 DNMS Teensy 声音传感器模块设计的轻量级 IC 驱动库,面向嵌入式音频监测场景提供标准化、低开销的声压级(SPL)数据采集能力。该库不依赖浮点运算或动态内存分配,完全适配资源受限的微控制器平台&am…...
OpenClaw飞书机器人实战:Qwen3-32B-Chat私有镜像接入
OpenClaw飞书机器人实战:Qwen3-32B-Chat私有镜像接入 1. 为什么选择OpenClaw飞书本地大模型? 去年我接手了一个小团队的效率工具改造项目,核心需求是"在不泄露内部数据的前提下,实现自动化日报生成和文件归档"。尝试过…...
fSpy完全上手指南:从基础到实战的零门槛教程
fSpy完全上手指南:从基础到实战的零门槛教程 【免费下载链接】fSpy A cross platform app for quick and easy still image camera matching 项目地址: https://gitcode.com/gh_mirrors/fs/fSpy 当你需要将一张普通的2D照片转换为精确的3D场景时,…...
OpenClaw多模态研究:Qwen2.5-VL-7B在学术资料分析中的应用
OpenClaw多模态研究:Qwen2.5-VL-7B在学术资料分析中的应用 1. 为什么选择OpenClawQwen2.5-VL进行学术研究 去年冬天整理博士论文参考文献时,我对着堆积如山的PDF文件突然意识到:传统文献管理工具只能解决"存储"问题,却…...
ThingsBoard源码本地部署实战:从环境准备到成功启动的避坑指南
1. 环境准备:打好地基才能盖高楼 第一次在本地部署ThingsBoard源码时,我像大多数开发者一样直接clone代码就往IDE里导,结果被各种依赖问题折腾得够呛。后来才发现,源码部署就像装修房子,水电改造(环境配置&…...
如何突破Office功能限制?本地化激活方案全解析
如何突破Office功能限制?本地化激活方案全解析 【免费下载链接】ohook An universal Office "activation" hook with main focus of enabling full functionality of subscription editions 项目地址: https://gitcode.com/gh_mirrors/oh/ohook 当…...
别再死记参数了!深入Halcon measure_pos算子底层:从高斯滤波到亚像素边缘的完整推导
深入解析Halcon measure_pos算子:从数学原理到工程调优 在工业视觉检测领域,亚像素级边缘检测一直是核心难题。当我们使用Halcon这类专业工具时,measure_pos算子看似简单易用,但真正理解其底层机制的人却寥寥无几。本文将带您穿透…...
