TextBox绑定double出现异常行为,如何修复?
问题根源
WPF默认的double类型绑定会在每次按键后立即尝试将输入字符串转换为double值:
- 输入
.3时,字符串可合法转换为0.3,绑定引擎更新源属性后回写值,导致显示变为0.3; - 输入
12.时,字符串会被转换为12(数值上等价),源属性更新为12后回写,后续输入3就变成了123; - 插入点号得到
12.3时,字符串可直接转换为合法double值,因此能正常保留; - 输入
abc123.时,转换失败,绑定引擎不更新源属性,TextBox保留原始输入。
修复方案
要保留用户输入状态同时实现实时验证,最优方式是将ViewModel中的绑定属性改为string类型,直接处理输入和验证,再转换为double供业务使用:
1. 修改ViewModel
public class Model : INotifyPropertyChanged, IDataErrorInfo { private string _priceInput; public string PriceInput { get => _priceInput; set { _priceInput = value; OnPropertyChanged(); OnPropertyChanged(nameof(PriceValue)); } } // 供业务逻辑使用的double值 public double PriceValue { get { double.TryParse(PriceInput, out double result); return result; } } // 实时验证逻辑 public string this[string columnName] { get { if (columnName == nameof(PriceInput)) { if (string.IsNullOrWhiteSpace(PriceInput)) { return "价格不能为空"; } if (!double.TryParse(PriceInput, out _)) { return "请输入有效的数值"; } } return null; } } public string Error => null; public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged([CallerMemberName] string propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } }
2. 更新XAML绑定
<TextBox Name="txtPrice" Text="{Binding Model.PriceInput, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged}" />
方案说明
- 绑定string属性后,
UpdateSourceTrigger=PropertyChanged会直接保留所有用户输入的字符,不会触发自动格式转换; - 通过
IDataErrorInfo实现实时验证,输入非法内容时会即时提示错误; PriceValue属性负责将合法输入转换为double,供业务逻辑调用。
内容的提问来源于stack exchange,提问作者CFlat
相关产品推荐
相关产品推荐

