两个关联TextBox如何通过SelectionChanged事件实现互相联动计算
两个TextBox联动功能正确实现方案
现有代码问题
- 事件选择错误:
SelectionChanged是文本选中状态变更时触发,无法响应输入内容修改的场景,应该改用TextChanged事件 - 存在死循环风险:主动修改控件Text属性会再次触发对应控件的文本变更事件,形成无限递归
- 逻辑错误:
Summary_SelectionChanged事件的else分支错误清空Summary本身,且代码存在语法错误(赋值行末尾缺少分号) - 未做输入合法性校验:未处理用户输入非数值内容的异常场景
实现步骤
- 在页面类中添加锁变量,用来区分是用户输入还是程序主动修改控件值,避免死循环
- 为两个TextBox绑定
TextChanged事件监听内容变更 - 修正联动逻辑,补充数值异常处理
完整代码实现
// 锁变量,标记当前是否为程序主动更新控件值,避免触发联动死循环 private bool _isUpdating = false; // 优化数值转换方法,增加异常兼容 private decimal ToDecimalValue(string input) { return decimal.TryParse(input, out decimal res) ? res : 0; } private void Amount_TextChanged(object sender, TextChangedEventArgs e) { // 程序主动更新时直接跳过逻辑 if (_isUpdating) return; try { _isUpdating = true; if (!string.IsNullOrWhiteSpace(Amount.Text)) { decimal amountVal = ToDecimalValue(Amount.Text); // 可根据需求调整数值格式化规则 Summary.Text = (amountVal * 100).ToString("0.##"); Summary.IsReadOnly = true; Amount.IsReadOnly = false; } else { // Amount清空时重置Summary状态 Summary.Text = string.Empty; Summary.IsReadOnly = false; Amount.IsReadOnly = false; } } finally { _isUpdating = false; } } private void Summary_TextChanged(object sender, TextChangedEventArgs e) { if (_isUpdating) return; try { _isUpdating = true; if (!string.IsNullOrWhiteSpace(Summary.Text)) { decimal summaryVal = ToDecimalValue(Summary.Text); Amount.Text = (summaryVal / 100).ToString("0.####"); Amount.IsReadOnly = true; Summary.IsReadOnly = false; } else { // Summary清空时重置Amount状态 Amount.Text = string.Empty; Amount.IsReadOnly = false; Summary.IsReadOnly = false; } } finally { _isUpdating = false; } }
XAML绑定示例
<TextBox x:Name="Amount" TextChanged="Amount_TextChanged"/> <TextBox x:Name="Summary" TextChanged="Summary_TextChanged"/>
如果需要严格限制用户只能输入数值,可额外绑定PreviewTextInput事件做输入拦截,避免非数字字符输入。
内容的提问来源于stack exchange,提问作者abdou31
相关产品推荐
相关产品推荐

