WPF XAML中如何为多个文本框复用绑定逻辑实现千分位数字分隔
问题原因
你当前遇到的所有文本框同步修改的问题,是因为三个TextBox都绑定到了同一个dbl_numeric属性。WPF绑定机制下,任意一个文本框修改值更新源属性后,所有绑定该属性的控件都会自动同步刷新,所以才会出现一改全改的情况,要实现独立显示只需要给每个文本框绑定各自独立的数值属性即可。
你之前单独配置StringFormat="0,0.0"不生效,通常是因为XAML中直接使用该格式需要添加转义符,正确写法是StringFormat={}{0:0,0.0},如果还是不生效,使用值转换器的方案更稳定,且不需要修改窗口的Code Behind代码。
实现方案
步骤1:修改Model类,添加独立属性
给每个文本框准备独立的绑定属性,同时实现属性变更通知保证界面自动刷新:
using System.ComponentModel; using System.Runtime.CompilerServices; namespace WpfApp5 { public class Validator : INotifyPropertyChanged { private double _dblNumeric1; public double DblNumeric1 { get => _dblNumeric1; set { _dblNumeric1 = value; OnPropertyChanged(); } } private double _dblNumeric2; public double DblNumeric2 { get => _dblNumeric2; set { _dblNumeric2 = value; OnPropertyChanged(); } } private double _dblNumeric3; public double DblNumeric3 { get => _dblNumeric3; set { _dblNumeric3 = value; OnPropertyChanged(); } } public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged([CallerMemberName] string propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } } }
步骤2:新增千分位转换器(独立类,不属于Code Behind)
using System; using System.Globalization; using System.Windows.Data; namespace WpfApp5 { public class ThousandsSeparatorConverter : IValueConverter { // 源属性转界面显示:添加千分位 public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { if (value is double num) { // N1表示保留1位小数,自动带千分位分隔符 return num.ToString("N1", CultureInfo.CurrentCulture); } return value; } // 界面输入转源属性:把带千分位的字符串转回数值 public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { if (value is string str && double.TryParse(str, NumberStyles.Any, CultureInfo.CurrentCulture, out double num)) { return num; } return value; } } }
步骤3:修改XAML代码
首先在Window标签内添加转换器资源引用:
<Window.Resources> <local:ThousandsSeparatorConverter x:Key="ThousandsConverter"/> </Window.Resources>
然后修改每个文本框的绑定,分别绑定独立属性并使用转换器:
<TextBox x:Name="TextBox1"> <Binding Path="DblNumeric1" UpdateSourceTrigger="PropertyChanged" Converter="{StaticResource ThousandsConverter}"> <Binding.ValidationRules> <ExceptionValidationRule ValidatesOnTargetUpdated="True"/> <validate:RequeredViladation/> </Binding.ValidationRules> </Binding> </TextBox> <TextBox x:Name="TextBox2"> <Binding Path="DblNumeric2" UpdateSourceTrigger="PropertyChanged" Converter="{StaticResource ThousandsConverter}"> <Binding.ValidationRules> <ExceptionValidationRule ValidatesOnTargetUpdated="True"/> <validate:RequeredViladation/> </Binding.ValidationRules> </Binding> </TextBox> <TextBox x:Name="TextBox3"> <Binding Path="DblNumeric3" UpdateSourceTrigger="PropertyChanged" Converter="{StaticResource ThousandsConverter}"> <Binding.ValidationRules> <ExceptionValidationRule ValidatesOnTargetUpdated="True"/> <validate:RequeredViladation/> </Binding.ValidationRules> </Binding> </TextBox>
配置完成后每个文本框的数值独立,输入数值失去焦点或输入过程中会自动显示千分位格式,实现1500.9 => 1,500.9的效果。
内容的提问来源于stack exchange,提问作者user17045931
相关产品推荐
相关产品推荐

