这是一个完整的菜鸟问题,我似乎无法弄清楚 . 我有一个文本框和一个文本块 . 文本框应为存款金额,文本块应为存款后的余额 . 它基本上只是存储箱中的值被添加到新余额框中的任何值,但我需要在用户输入时完成此数学运算 . 基本上,当用户键入存款文本框时,我希望将存款中的值添加到存款后文本块中的值 . 这不会更新,如果我通过调试器运行它不会在用户输入时停止程序,所以我知道它不会识别属性正在被更改但我似乎无法理解为什么 . 我有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 回答
我不确定你是如何在代码中填充_balanceAfterDeposit和_balance的 . 但根据给出的示例代码,您可以在BalanceAfterDeposit中提供
get
. 因为你已经为了新的余额而制作了TextBox
ReadyOnly
. 所以用户无法进入,因此只有Get就足够了 .现在,为了显示更新的BalanceAfterDeposit,只要DepositAmount发生更改,您甚至需要在BalanceAfterDeposit上调用
PropertyChanged
. 因此需要在DepositAmount属性集中显式调用它 .Updated :默认情况下绑定模式是
TwoWay
,我给出了OneWay
绑定 . 这将解决标记运行时错误 .让我们为_Balance金额给出一些 Value .
并且让我们在存款后更改 property 余额
我使用了_depositAmount _balance .
由于您只在DepositAmount中编辑数据,因此BalanceAfterDeposit仅为计算字段 . (我假设你正在做一些数学运算,之后你想要显示BalanceAfterDeposit . 在这个例子中,BalanceAfterDeposit所需的唯一输入是DepositAmount) . 现在问题发生了 .
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) .