我正在创建一个贷款计算器,我有3个TextBox,我试图互相反映。在我更改其中一个TextBox的输入后,我希望另外两个基于输入重新计算,方法是按下我的程序上的计算按钮或者TextBox失去焦点。
我得到的三个TextBox绑定了某些值,这些值在运行程序时设置,并且能够在运行时更改:
<TextBox Width="55" Height="23" Style="{StaticResource ResourceKey=StandardTextbox}" Text="{Binding StringFormat={}{0:P}, Path=CurrentLoan.PropertyTaxRate, Converter={StaticResource TextBoxToDecimalConverter1}}"/>
<TextBox Width="65" Height="23" Style="{StaticResource ResourceKey=StandardTextbox}" Text="{Binding StringFormat={}{0:C}, Path=CurrentLoan.PropertyTaxMonth, Converter={StaticResource TextBoxToDecimalConverter1}}"/>
<TextBox Width="65" Height="23" Style="{StaticResource ResourceKey=StandardTextbox}" Text="{Binding StringFormat={}{0:C}, Path=CurrentLoan.PropertyTaxYear, Converter={StaticResource TextBoxToDecimalConverter1}}"/>
CurrentLoan.PropertyTaxRate = .012;
CurrentLoan.PropertyTaxMonth = 250;
CurrentLoan.PropertyTaxYear = 3000;
SharedValues.HomeValue = 250000;
对于价值250,000美元且税率为1.2%的房屋,每年支付3000美元(250,000 * .012),每月支付250美元(一年3,000 / 12个月)。
此外,我已经声明了这样的属性:
public double PropertyTaxRate
{
get { return _propertyTaxRate; }
set { SetValueAndNotify(() => PropertyTaxRate, ref _propertyTaxRate, (value > 1) ? value / 100 : value); }
}
public double PropertyTaxMonth
{
get { return _propertyTaxMonth; }
set { SetValueAndNotify(() => PropertyTaxMonth, ref _propertyTaxMonth, value); }
}
public double PropertyTaxYear
{
get{ return _propertyTaxYear; }
set { SetValueAndNotify(() => PropertyTaxYear, ref _propertyTaxYear, value); }
}
SetValueAndNotify方法只是将值设置为backing属性,并使用INotifyPropertyChanged通知GUI该属性已更改。
假如我将PropertyTaxYear属性更改为$ 6,000,我希望PropertyTaxMonth更改为$ 500,PropertyTaxRate更改为2.4%。任何人都有关于如何做到这一点并让这些属性相互反映的想法?感谢您提前输入!
答案 0 :(得分:1)
尝试这一点并小心避免无休止的递归。检查if (value != <old value>)
会有所帮助。在设置其他相关属性之前,请调用SetValueAndNotify
以使此检查有效。
public double PropertyTaxRate
{
get { return _propertyTaxRate; }
set {
if (value > 1) {
value /= 100;
}
if (value != _propertyTaxRate) {
SetValueAndNotify(() => PropertyTaxRate, ref _propertyTaxRate, value);
PropertyTaxYear = value * SharedValues.HomeValue;
}
}
}
public double PropertyTaxMonth
{
get { return _propertyTaxMonth; }
set {
if (value != _propertyTaxMonth) {
SetValueAndNotify(() => PropertyTaxMonth, ref _propertyTaxMonth, value);
PropertyTaxYear = 12 * value;
}
}
}
public double PropertyTaxYear
{
get{ return _propertyTaxYear; }
set {
if (value != _propertyTaxYear) {
SetValueAndNotify(() => PropertyTaxYear, ref _propertyTaxYear, value);
PropertyTaxMonth = value / 12;
PropertyTaxRate = value / SharedValues.HomeValue;
}
}
}
<强>更新强>
递归问题比预期的要困难。由于SetValueAndNotify
可能会触发意外行为,我建议对支持变量进行所有计算,并在完成后通知。 (我没有显示仍然创建OnNotifyPropertyChanged
方法的代码。)
private void Notify()
{
OnNotifyPropertyChanged(() => PropertyTaxRate);
OnNotifyPropertyChanged(() => PropertyTaxYear);
OnNotifyPropertyChanged(() => PropertyTaxMonth);
}
public double PropertyTaxRate
{
get { return _propertyTaxRate; }
set {
if (value > 1) {
value /= 100;
}
if (value != _propertyTaxRate) {
_propertyTaxRate = value;
_propertyTaxYear = value * SharedValues.HomeValue;
_propertyTaxMonth = _propertyTaxYear / 12;
Notify();
}
}
}
public double PropertyTaxMonth
{
get { return _propertyTaxMonth; }
set {
if (value != _propertyTaxMonth) {
_propertyTaxMonth = value;
_propertyTaxYear = 12 * value;
_propertyTaxRate = _propertyTaxYear / SharedValues.HomeValue;
Notify();
}
}
}
public double PropertyTaxYear
{
get{ return _propertyTaxYear; }
set {
if (value != _propertyTaxYear) {
_propertyTaxYear = value;
_propertyTaxMonth = value / 12;
_propertyTaxRate = value / SharedValues.HomeValue;
Notify();
}
}
}