如何在用户键入时进行源更新

How to make source update while user types

这是一个完全菜鸟的问题,我似乎无法弄清楚。我有一个文本框和一个文本块。文本框应该是存款金额,文本块应该是存款后的余额。它基本上只是将存款箱中的值添加到新余额箱中的任何值,但我需要在用户键入时完成此数学运算。基本上当用户在存款文本框中输入时,我希望将存款中的值添加到存款后文本块中的值。这不会更新,如果我通过调试器 运行 它不会在用户键入时停止程序,所以我知道它无法识别 属性 正在被更改,但我可以'我似乎不明白为什么。我设置了数据上下文,并且我知道它没有绑定错误,因为绑定与常规文本一起使用,所以我觉得没有必要在这里显示它。我怀疑这只是我的数学和绑定的简单事情。 文本框和文本块的代码在这里:

 <!-- TextBlock and TextBox for deposit -->
    <TextBlock Text="Deposit:" TextAlignment="Center" VerticalAlignment="Center" FontSize="30" FontWeight="Bold"/>
    <TextBox Text="{Binding DepositAmount, UpdateSourceTrigger=PropertyChanged}" BorderBrush="Black" BorderThickness="3" Padding="3" Margin="-60 15 30 10" Grid.Column="1"/>

    <!-- TextBlock and TextBox for new balance -->
    <TextBlock Text="New Balance:" Margin="5 0 0 0" TextAlignment="Left" VerticalAlignment="Center" FontSize="28" FontWeight="Bold" Grid.Row="1"/>
    <TextBox Text="{Binding BalanceAfterDeposit, UpdateSourceTrigger=PropertyChanged}" FontWeight="Bold" IsReadOnly="True" BorderBrush="Black" BorderThickness="3" Padding="3" Margin="-60 15 30 10" Grid.Column="1" Grid.Row="1"/>

两个属性在这里:

public double DepositAmount
    {
        get => this._depositAmount;
        set
        {
            if (this._depositAmount != value)
            {
                this._depositAmount = value;
                OnPropertyChanged(nameof(DepositAmount));
            }
        }
    }

    public double BalanceAfterDeposit
    {
        get => this._balanceAfterDeposit + _balance;
        set
        {
            if ((this._balanceAfterDeposit + _balance) != value)
            {
                this._balanceAfterDeposit = value;
                OnPropertyChanged(nameof(BalanceAfterDeposit));
            }
        }
    }

这可能是一个非常愚蠢的数学错误,但我们将不胜感激!如果您对我的代码有任何建议,那也很有帮助。谢谢!

我不确定您是如何在代码中填充 _balanceAfterDeposit 和 _balance 的。但是根据给定的示例代码,您可以在 BalanceAfterDeposit 中提供 get。因为你为new balance做了TextBoxReadyOnly。所以用户无法进入,因此,只有 Get 就足够了。

    public double BalanceAfterDeposit
    {
        get => this._balanceAfterDeposit + _balance;
    }

现在,为了显示更新后的 BalanceAfterDeposit,只要 DepositAmount 发生变化,您甚至需要在 BalanceAfterDeposit 上调用 PropertyChanged。因此需要在 DepositAmount 属性.

集合中显式调用它
        public double DepositAmount
    {
        get => this._depositAmount;
        set
        {
            if (this._depositAmount != value)
            {
                this._depositAmount = value;
                OnPropertyChanged(nameof(DepositAmount));
                OnPropertyChanged(nameof(BalanceAfterDeposit));
            }
        }
    }

已更新: 默认Binding Mode是TwoWay,我给的是OneWay Binding。这将解决标记运行时错误。

 <TextBox Text="{Binding BalanceAfterDeposit, UpdateSourceTrigger=PropertyChanged,Mode=OneWay}" FontWeight="Bold" IsReadOnly="True" BorderBrush="Black" BorderThickness="3" Padding="3" Margin="68,15,30,10" Grid.Column="1" Grid.Row="1"/>

让我们给 _Balance 金额一些值。

private double _balance=19000;

让我们更改 属性 存款后的余额

        public double BalanceAfterDeposit
    {
        get => this._depositAmount + _balance;
    }

我使用了_depositAmount + _balance。

由于您只是在编辑DepositAmount 中的数据,而BalanceAfterDeposit 只是计算字段。 (我假设您正在做一些数学运算,在此之后,您想要显示 BalanceAfterDeposit。在此示例中,BalanceAfterDeposit 所需的唯一输入是 DepositAmount)。 现在问题发生在这里。

  1. 您筹集的 DepositAmount属性 仅针对 DepositAmount 进行了更改。它不会通知其他属性做某事。在您的情况下,您需要为 BalanceAfterDeposit 显式提高 属性。如下所示

    public双倍存款金额 { 得到 => this._depositAmount; 放 { 如果(this._depositAmount != 值) { this._depositAmount = 值; 在属性更改(nameof(DepositAmount)); On属性Changed(nameof(BalanceAfterDeposit)); } } }

这将强制 UI 从 BalanceAfterDeposit 更新自身。因此你会看到 getter 将被调用。

  1. 由于 BalanceAfterDeposit 是计算字段,您不会从外部更新它(在您的情况下。)所以 getter 对您来说足够了,即在 [=35 中进行计算=], 和 return.

  2. 待改进。我想建议您定义异步方法,它基本上会进行所有计算并最终在 BalanceAfterDeposit 中设置值。在私有字段中设置值后,在 DepositAmount 的 setter 中调用此方法。 在此建议中,您必须在 BalanceAfterDeposit 中定义 setter 和 getter。(正如我在第 2 点中提到的,您不需要 setter)。