You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

两个关联TextBox如何通过SelectionChanged事件实现互相联动计算

两个TextBox联动功能正确实现方案

现有代码问题

  • 事件选择错误:SelectionChanged 是文本选中状态变更时触发,无法响应输入内容修改的场景,应该改用 TextChanged 事件
  • 存在死循环风险:主动修改控件Text属性会再次触发对应控件的文本变更事件,形成无限递归
  • 逻辑错误:Summary_SelectionChanged 事件的else分支错误清空Summary本身,且代码存在语法错误(赋值行末尾缺少分号)
  • 未做输入合法性校验:未处理用户输入非数值内容的异常场景

实现步骤

  1. 在页面类中添加锁变量,用来区分是用户输入还是程序主动修改控件值,避免死循环
  2. 为两个TextBox绑定TextChanged事件监听内容变更
  3. 修正联动逻辑,补充数值异常处理

完整代码实现

// 锁变量,标记当前是否为程序主动更新控件值,避免触发联动死循环
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 15:36:03