属性值反映了另一个属性的值

本文关键字:属性 另一个 | 更新日期: 2023-09-27 18:34:50

我正在创建一个贷款计算器,我有3个文本框,我试图相互反映。在我更改其中一个文本框的输入后,我希望其他 2 个文本框通过按程序上的计算按钮或在文本框失去焦点后根据输入重新计算。

我拥有的三个文本框绑定到在正在运行的程序时设置的某些值以及在运行时更改的能力:

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

方法只是将值设置为支持属性,并使用 INotifyPropertyChanged 通知 GUI 属性已更改。

假设我将 PropertyTaxYear 属性更改为 6,000 美元,我希望 PropertyTaxMonth 更改为 500 美元,将 PropertyTaxRate 更改为 2.4%。有人对如何做到这一点并使属性相互反映有想法吗?提前感谢您的投入!

属性值反映了另一个属性的值

试试这个,小心避免无休止的递归。它有助于检查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();
        }
    }
}