假设我有一个简单的Order类,该类具有一个TotalPrice计算的属性,可以将其绑定(bind)到WPF UI

public class Order : INotifyPropertyChanged
{
  public decimal ItemPrice
  {
    get { return this.itemPrice; }
    set
    {
       this.itemPrice = value;
       this.RaisePropertyChanged("ItemPrice");
       this.RaisePropertyChanged("TotalPrice");
    }
  }

  public int Quantity
  {
    get { return this.quantity; }
    set
    {
       this.quantity= value;
       this.RaisePropertyChanged("Quantity");
       this.RaisePropertyChanged("TotalPrice");
    }
  }

  public decimal TotalPrice
  {
    get { return this.ItemPrice * this.Quantity; }
  }
}

在影响TotalPrice计算的属性中调用RaisePropertyChanged(“TotalPrice”)是一种好习惯吗?刷新TotalPrice属性的最佳方法是什么?
当然,另一个版本要做的是这样改变属性
public decimal TotalPrice
{
    get { return this.ItemPrice * this.Quantity; }
    protected set
    {
        if(value >= 0)
            throw ArgumentException("set method can be used for refresh purpose only");

    }
}

并调用TotalPrice = -1而不是this.RaisePropertyChanged(“TotalPrice”);在其他属性中。请提出更好的解决方案

非常感谢

最佳答案

可以检查是否应该从可能更改该值的任何其他成员那里引发此事件,但是只有在您实际更改该值时才这样做。

您可以将其封装在方法中:

private void CheckTotalPrice(decimal oldPrice)
{
    if(this.TotalPrice != oldPrice)
    {
         this.RaisePropertyChanged("TotalPrice");
    }
}

然后,您需要从其他变异成员那里调用它:
var oldPrice = this.TotalPrice;
// mutate object here...
this.CheckTotalPrice(oldPrice);

10-08 02:16