如何在用户键入时进行源更新
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做了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));
}
}
}
已更新:
默认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)。
现在问题发生在这里。
您筹集的 DepositAmount属性 仅针对 DepositAmount 进行了更改。它不会通知其他属性做某事。在您的情况下,您需要为 BalanceAfterDeposit 显式提高 属性。如下所示
public双倍存款金额
{
得到 => this._depositAmount;
放
{
如果(this._depositAmount != 值)
{
this._depositAmount = 值;
在属性更改(nameof(DepositAmount));
On属性Changed(nameof(BalanceAfterDeposit));
}
}
}
这将强制 UI 从 BalanceAfterDeposit 更新自身。因此你会看到 getter 将被调用。
由于 BalanceAfterDeposit 是计算字段,您不会从外部更新它(在您的情况下。)所以 getter 对您来说足够了,即在 [=35 中进行计算=], 和 return.
待改进。我想建议您定义异步方法,它基本上会进行所有计算并最终在 BalanceAfterDeposit 中设置值。在私有字段中设置值后,在 DepositAmount 的 setter 中调用此方法。
在此建议中,您必须在 BalanceAfterDeposit 中定义 setter 和 getter。(正如我在第 2 点中提到的,您不需要 setter)。
这是一个完全菜鸟的问题,我似乎无法弄清楚。我有一个文本框和一个文本块。文本框应该是存款金额,文本块应该是存款后的余额。它基本上只是将存款箱中的值添加到新余额箱中的任何值,但我需要在用户键入时完成此数学运算。基本上当用户在存款文本框中输入时,我希望将存款中的值添加到存款后文本块中的值。这不会更新,如果我通过调试器 运行 它不会在用户键入时停止程序,所以我知道它无法识别 属性 正在被更改,但我可以'我似乎不明白为什么。我设置了数据上下文,并且我知道它没有绑定错误,因为绑定与常规文本一起使用,所以我觉得没有必要在这里显示它。我怀疑这只是我的数学和绑定的简单事情。 文本框和文本块的代码在这里:
<!-- 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做了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));
}
}
}
已更新:
默认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)。 现在问题发生在这里。
您筹集的 DepositAmount属性 仅针对 DepositAmount 进行了更改。它不会通知其他属性做某事。在您的情况下,您需要为 BalanceAfterDeposit 显式提高 属性。如下所示
public双倍存款金额 { 得到 => this._depositAmount; 放 { 如果(this._depositAmount != 值) { this._depositAmount = 值; 在属性更改(nameof(DepositAmount)); On属性Changed(nameof(BalanceAfterDeposit)); } } }
这将强制 UI 从 BalanceAfterDeposit 更新自身。因此你会看到 getter 将被调用。
由于 BalanceAfterDeposit 是计算字段,您不会从外部更新它(在您的情况下。)所以 getter 对您来说足够了,即在 [=35 中进行计算=], 和 return.
待改进。我想建议您定义异步方法,它基本上会进行所有计算并最终在 BalanceAfterDeposit 中设置值。在私有字段中设置值后,在 DepositAmount 的 setter 中调用此方法。 在此建议中,您必须在 BalanceAfterDeposit 中定义 setter 和 getter。(正如我在第 2 点中提到的,您不需要 setter)。