using System; using System.ComponentModel; namespace TipCalc { class TipCalcModel : INotifyPropertyChanged { double subTotal, postTaxTotal, tipPercent, tipAmount, total; public event PropertyChangedEventHandler PropertyChanged; public double SubTotal { set { if (subTotal != value) { subTotal = value; OnPropertyChanged("SubTotal"); Recalculate(); } } get { return subTotal; } } public double PostTaxTotal { set { if (postTaxTotal != value) { postTaxTotal = value; OnPropertyChanged("PostTaxTotal"); Recalculate(); } } get { return postTaxTotal; } } public double TipPercent { set { if (tipPercent != value) { tipPercent = value; OnPropertyChanged("TipPercent"); Recalculate(); } } get { return tipPercent; } } public double TipAmount { set { if (tipAmount != value) { tipAmount = value; OnPropertyChanged("TipAmount"); } } get { return tipAmount; } } public double Total { set { if (total != value) { total = value; OnPropertyChanged("Total"); } } get { return total; } } void Recalculate() { this.TipAmount = Math.Round(this.TipPercent * this.SubTotal / 100, 2); // Round total to nearest quarter. this.Total = Math.Round(4 * (this.PostTaxTotal + this.TipAmount)) / 4; } protected void OnPropertyChanged(string propertyName) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } } }