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个可选值:

  1. OneWay:这是单向绑定的默认模式。当源属性的值改变时,目标属性(即 TextBox 的 Text 属性)的值会自动更新。但是,对目标属性的更改不会传播回源属性。

  2. TwoWay:这是双向绑定的模式。当源属性或目标属性的值改变时,另一个属性的值也会自动更新。在 TextBox 的上下文中,这意味着当你在文本框中输入文本时,绑定的源属性会更新;同样地,如果源属性的值在代码中被改变,文本框中的内容也会更新。

  3. OneWayToSource:这是另一种单向绑定模式,但与 OneWay 相反。在这种模式下,当目标属性(TextBox 的 Text 属性)的值改变时,源属性的值也会更新,但源属性的变化不会影响到目标属性。

  4. OneTime:在这种模式下,数据只在绑定时从源传输到目标一次。之后,源属性的变化不会反映到目标属性上,并且目标属性的变化也不会尝试回写到源属性。

  5. 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均不能输入除数字和小数点以外的字符。

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

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

相关文章

centos 7.9 离线环境安装GPU服务环境

文章目录 centos 7.9 离线环境安装GPU服务环境系统配置更新 gcc更新内核安装显卡驱动安装cuda安装docker 和 nvidia-container-runtime验证 centos 7.9 离线环境安装GPU服务环境 基于centos 7.9 离线安装gpu 服务基础环境&#xff0c;用于在docker 中运行算法服务 系统配置 …

LeetCode 全排列

思路&#xff1a;这是一道暴力搜索问题&#xff0c;我们需要列出答案的所有可能组合。 题目给我们一个数组&#xff0c;我们很容易想到的做法是将数组中的元素进行排列&#xff0c;如何区分已选中和未选中的元素&#xff0c;容易想到的是建立一个标记数组&#xff0c;已经选中的…

二轴机器人装箱机:重塑物流效率,精准灵活,引领未来装箱新潮流

在现代化物流领域&#xff0c;高效、精准与灵活性无疑是各大企业追求的核心目标。而在这个日益追求自动化的时代&#xff0c;二轴机器人装箱机凭借其较佳的性能和出色的表现&#xff0c;正逐渐成为装箱作业的得力助手&#xff0c;引领着未来装箱新潮流。 一、高效&#xff1a;重…

解析桥式整流电路

下面这个桥式整流电路出场率很高&#xff0c;看着一定眼熟。 事实证明&#xff0c;强行灌输的东西总是难以下咽。记得读书那会&#xff0c;第一次看到这个电路时被吓到了&#xff0c;以至于直到这门课结束了也没搞清楚。 本文就来分析一下此电路中电流的走向&#xff0c;进而理…

Spark SQL 的总体工作流程

Spark SQL 是 Apache Spark 的一个模块,它提供了处理结构化和半结构化数据的能力。通过 Spark SQL,用户可以使用 SQL 语言或 DataFrame API 来执行数据查询和分析。这个模块允许开发者将 SQL 查询与 Spark 的数据处理能力结合起来,实现高效、优化的数据处理。下面是 Spark S…

Labview绘制柱状图

废话不多说&#xff0c;直接上图 我喜欢用NXG风格&#xff0c;这里我个人选的是xy图。 点击箭头指的地方 选择直方图 插值选择第一个 直方图类型我选的是第二个效果如图。 程序部分如图。 最后吐槽一句&#xff0c;现在看CSDN好多文章都要收费了&#xff0c;哪怕一些简单的入…

Spark SQL----ANSI Compliance

Spark SQL----ANSI Compliance 一、算术运算二、Cast2.1 Rounding in cast 三、存储分配四、Type coercion4.1 类型提升和优先级4.2 最不常见类型解析 五、SQL函数5.1 函数调用5.2 具有不同行为的函数 六、SQL操作符七、ANSI模式的有用函数八、SQL关键字(可选&#xff0c;默认禁…

浪子易支付最新增加订单投诉版源码

此版本增加了订单投诉功能&#xff0c;和一个好看的二次元模板。

【Python实战因果推断】9_元学习器4

目录 Double/Debiased Machine Learning Double/Debiased Machine Learning Double/Debiased ML 或 R-learner 可以看作是 FrischWaugh-Lovell 定理的改进版。其思路非常简单--在构建结果和治疗残差时使用 ML 模型 结果和干预残差&#xff1a; , 预估&#xff0c;预估 由于 …

Python28-4 KNN近邻算法

KNN&#xff08;K-Nearest Neighbors&#xff09;算法是一种常用的机器学习算法&#xff0c;主要用于分类和回归问题。 1. KNN算法的基本概念 KNN算法是一种基于实例的学习算法&#xff0c;也称为惰性学习&#xff08;Lazy Learning&#xff09;算法&#xff0c;因为它在训练…

51单片机第17步_外部中断

本章重点学习外部中断。 1、外部中断0框图&#xff1a; 2、外部中断1框图&#xff1a; 3、Keil C51中有一些关键字&#xff0c;需要牢记&#xff1a; interrupt 0&#xff1a;指定当前函数为外部中断0&#xff1b; interrupt 1&#xff1a;指定当前函数为定时器0中断&#x…

2 z变换与离散时间傅里叶变换

目录 序列的z变换 z变换的定义 常用典型序列的z变换 序列类型与z变换的收敛域 序列的分类 X(z)的极点与收敛域 单边序列 双边序列 z变换的性质 线性 序列移位 单边序列 双边序列 z域尺度变换 序列乘以n 复共轭序列的z变换 初值定理 终值定理 时域卷积定理 …

Spring事务及其传播机制(二)

目录 1.Transcational详解 1.1 rollbackFor 2事务隔离级别 2.1MySQL事务隔离级别回顾 2.2Spring事务隔离级别 3.Spring事务传播机制 3.1什么是事务传播机制 3.2事务的传播机制有哪些 3.3 Spring 事务传播机制使用和各种场景演示 3.3.1 REQUIRED(加入事务) 3.3.2 REQ…

Apache ZooKeeper 简介

介绍 Apache ZooKeeper 是一种分布式协调服务&#xff0c;旨在管理和同步大量分布式应用程序。ZooKeeper 是 Apache 软件基金会下的一个开源项目&#xff0c;它解决了维护分布式应用程序的配置信息、命名、分布式同步和组服务的复杂性。本文探讨了 ZooKeeper 的架构、功能、应…

商标字体的选择:企业和个人申请注册商标攻略!

对于汉字商标&#xff0c;就会涉及到字体的选择&#xff0c;普推商标老杨也经常看到企业因为文字商标字体侵权收到相关字体公司的律师函&#xff0c;所以商标字体选择上要特别注意。 建议选择可以商用的免费字体&#xff0c;常见的有黑体、宋体等&#xff0c;如果这些字体前面…

基于matlab的可乐标签模板匹配

1 建模思路 1.图像预处理&#xff1a; 如果目标图像和模板图像是彩色的&#xff08;即RGB图像&#xff09;&#xff0c;则将它们转换为灰度图像&#xff0c;以便在单通道上进行匹配。使用rgb2gray函数进行灰度化。 2.获取模板大小&#xff1a; 使用size函数获取模板图像的高…

2000-2022年上市公司数字化转型与绿色创新质量匹配数据(含控制变量)

2000-2022年上市公司数字化转型与绿色创新质量匹配数据&#xff08;含控制变量&#xff09;https://download.csdn.net/download/a519573917/89501000 目录 上市公司数字化转型与绿色创新质量匹配的实证研究 一、引言 二、文献综述 三、实证模型 四、数据来源与描述性统计 …

tomcat8.5在windows下运行出现日志中文乱码

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 http://218.75.87.38:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a; h…

Linux 2-Vim使用

1 什么是vi及vim&#xff1f; vi是文本编辑器&#xff1b;vim是程序开发工具。 2 vi的几种模式 1 一般模式&#xff1a;vi <fileName> 就进入命令模式&#xff0c;可以删除或者复制粘贴 2 编辑模式&#xff1a;修改内容 3 命令行模式&#xff1a;最下面一行&#xf…

NetSuite Amount正负符号在Saved Search和DataSet中的不同含义

近期在一个项目中碰到Amount取值的Bug&#xff0c;原因是我们的代码中数据源从Saved Search转为了DataSet&#xff0c;由于这个转换导致了Amount的正负值混乱。今天记录一下。 正负号原则 • Saved Search&#xff0c; Amount的正负需要考虑科目类型。 Amount字段根据科目类型…