Как сделать обновление источника, пока пользователь вводит - PullRequest
0 голосов
/ 09 декабря 2018

Это полный вопрос, который я, похоже, не могу понять.У меня есть текстовое поле и текстовый блок.В текстовом поле должна быть сумма депозита, а в текстовом блоке - баланс после депозита.По сути, это просто значение в ячейке для депозита, добавляемое к значению в новом окне баланса, но мне нужно, чтобы эта математика была выполнена, пока пользователь печатает.Обычно, когда пользователь вводит текстовое поле для депозита, я хочу, чтобы значение в депозите было добавлено к значению в текстовом блоке после депозита.Это не обновляется, и если я запускаю его через отладчик, он не останавливает программу, пока пользователь печатает, поэтому я знаю, что он не распознает, что свойство изменяется, но я не могу понять, почему,У меня есть набор данных 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 голосов
/ 09 декабря 2018

Поскольку вы редактируете данные только в DepositAmount, а BalanceAfterDeposit является только рассчитанным полем.(Я предполагаю, что вы выполняете некоторые математические операции, и после этого вы хотите отобразить BalanceAfterDeposit. Единственный вход, необходимый для BalanceAfterDeposit, - это DepositAmount в этом примере).Теперь проблема возникает здесь.

  1. В DepositAmount ваш RaiseProperty изменен только для DepositAmount.который не уведомляет другие свойства, чтобы сделать что-то.В вашем случае вам нужно явно повысить свойство для BalanceAfterDeposit.Как указано ниже

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

Это заставит пользовательский интерфейс обновляться из BalanceAfterDeposit.Поэтому вы увидите, что getter будет вызван.

Поскольку BalanceAfterDeposit является вычисляемым полем, и вы не собираетесь обновлять его извне (в вашем случае.), Так что вам достаточно геттера, т.е. выполните вычисления в геттере и вернитесь.

Для улучшения.Я хотел бы предложить вам определить асинхронный метод, который будет в основном выполнять все вычисления и, наконец, устанавливать значение в BalanceAfterDeposit.Вызовите этот метод в установщике DepositAmount после установки значения в приватном поле.В этом предложении вы должны определить setter и getter в BalanceAfterDeposit. (Как и в пункте 2, я упомянул, что вам не нужен setter).

0 голосов
/ 09 декабря 2018

Я не уверен, как вы заполняете _balanceAfterDeposit и _balance в своем коде.Но на основе приведенного примера кода вы можете просто указать get в BalanceAfterDeposit.Потому что вы сделали TextBox ReadyOnly для нового баланса.Таким образом, пользователь никак не может войти, поэтому достаточно только Get.

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

Теперь, чтобы отобразить обновленный BalanceAfterDeposit, вам нужно вызывать PropertyChanged даже для BalanceAfterDeposit, когда естьизменить в DepositAmount.Поэтому нужно явно вызывать его в наборе свойства DepositAmount.

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

Обновлено : по умолчанию установлен режим привязки 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.

private double _balance=19000;

и изменим свойство Balance после депозита

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

Я использовал _depositAmount + _balance.

...