首页 文章

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

提问于
浏览
0

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

<!-- 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));
            }
        }
    }

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

2 回答

  • 0

    我不确定你是如何在代码中填充_balanceAfterDeposit和_balance的 . 但根据给出的示例代码,您可以在BalanceAfterDeposit中提供 get . 因为你已经为了新的余额而制作了 TextBox ReadyOnly . 所以用户无法进入,因此只有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));
                }
            }
        }
    

    Updated :默认情况下绑定模式是 TwoWay ,我给出了 OneWay 绑定 . 这将解决标记运行时错误 .

    <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金额给出一些 Value .

    private double _balance=19000;
    

    并且让我们在存款后更改 property 余额

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

    我使用了_depositAmount _balance .

  • 0

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

    • 在DepositAmount中,您只为DepositAmount更改了RaiseProperty . 这不会通知其他 property 做某事 . 在您的情况下,您需要为BalanceAfterDeposit显式提升属性 . 如下所示

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

    这将强制UI从BalanceAfterDeposit更新自身 . 因此,您将看到将调用getter .

    • 由于BalanceAfterDeposit是计算字段,你不会从外面更新它(在你的情况下) . 所以getter足够你,即在getter中进行计算,然后返回 .

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

相关问题