属性值反映了另一个

时间:2012-05-20 20:10:06

标签: c# wpf visual-studio-2010

我正在创建一个贷款计算器,我有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%。任何人都有关于如何做到这一点并让这些属性相互反映的想法?感谢您提前输入!

1 个答案:

答案 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();
        }
    }
}