这里最常提供的解决方案似乎是获取税值所依赖的所有属性,以便在 ModelView 中为属性本身和依赖它的每个属性调用 PropertyChanged。
不,支持属性不需要自己的更改通知,除非它们正在显示。但是每个属性都需要OnPropertyChanged("TaxValue")
直接在他们的 setter(s) 中调用税收值;或间接根据下面的示例。这样,由于支持属性已更改,因此 UI 会更新。
话虽如此,让我们考虑一个例子。一种方法是创建一种方法来计算值。当设置最终值(下面的 TaxValue)时,它将调用OnNotifyPropertyChange
. 该操作会将 TaxValue 更改通知给整个世界的用户;无论是什么值触发它(扣除|费率|收入):
public class MainpageVM : INotifyPropertyChanged
{
public decimal TaxValue
{
get { return _taxValue; }
set { _taxValue = value; OnPropertyChanged(); } // Using .Net 4.5 caller member method.
}
public decimal Deduction
{
get { return _deduction; }
set { _deduction = value; FigureTax(); }
}
public decimal Rate
{
get { return _rate; }
set { _rate = value; FigureTax(); }
}
public decimal Income
{
get { return _income; }
set { _income = value; FigureTax(); }
}
// Something has changed figure the tax and update the user.
private void FigureTax()
{
TaxValue = (Income - Deduction) * Rate;
}
#region INotifyPropertyChanged
public event PropertyChangedEventHandler PropertyChanged;
/// <summary>Raises the PropertyChanged event.</summary>
/// <param name="propertyName">The name of the property that has changed, only needed
/// if called from a different source.</param>
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
#endif
}
编辑
要在 .Net 4 中使用 CallerMemberName(和其他项目),请安装 Nuget 包:
微软.BCL。
或者如果不使用标准OnPropetyChanged("TaxValue")
。