Entry控件小数点丢失问题:如何按区域文化适配DecimalConverter?
解决DecimalConverter无法保留小数及区域文化适配问题
问题根源
Convert方法中直接调用decimal.ToString()未指定区域文化,可能导致小数格式与当前系统区域不匹配;ConvertBack方法未使用传入的CultureInfo参数解析字符串,当输入包含区域专属小数分隔符的内容时,可能解析失败返回0;- Entry绑定默认在失去焦点时更新数据源,输入小数点的过程中易触发回写整数的情况。
修改后的转换器代码
public class DecimalConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { if (value is decimal decimalValue) { // 使用传入的区域文化格式化小数,确保显示正确的分隔符 return decimalValue.ToString(culture); } return value; } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { var inputStr = value as string; if (string.IsNullOrWhiteSpace(inputStr)) return 0m; // 处理输入仅含小数点的情况(如"55."),补0后再解析 if (inputStr.EndsWith(culture.NumberFormat.NumberDecimalSeparator)) { inputStr += "0"; } if (decimal.TryParse(inputStr, NumberStyles.Number, culture, out decimal dec)) { return dec; } return 0m; } }
Entry绑定调整
需要将绑定的UpdateSourceTrigger设置为PropertyChanged,确保输入内容实时触发转换,避免输入过程中被回写为整数:
<Entry BackgroundColor="{TemplateBinding BackgroundColorAmountEntry}" IsEnabled="{TemplateBinding IsByAmount}" Keyboard="Numeric" Text="{TemplateBinding CommissionWithTaxAmount, Converter={StaticResource DecimalConverter}, UpdateSourceTrigger=PropertyChanged}" />
关键修改说明
- Convert方法:明确使用传入的
culture参数格式化小数,保证显示的分隔符与当前区域一致; - ConvertBack方法:
- 处理输入末尾仅为小数点的特殊场景,避免解析失败返回0;
- 调用
decimal.TryParse时指定culture和NumberStyles.Number,确保正确解析区域化的小数字符串;
- Entry绑定:设置
UpdateSourceTrigger=PropertyChanged,让输入的每一个字符都触发转换,避免输入小数点后被立即回写为整数。
内容的提问来源于stack exchange,提问作者SarPa
相关产品推荐
相关产品推荐

