我使用 CallerMemberName
实现了INotifyPropertyChanged
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
因此,这可以在任何属性的 setter 中调用为 - OnPropertyChanged()
,每当设置属性更改事件时,它都会通知属性更改事件。这不仅仅是一个属性的情况。例如
private DateTime _dob;
public DateTime DateOfBirth
{
get
{
return _dob;
}
private set
{
_dob = value;
OnPropertyChanged();
OnPropertyChanged("Age");
}
}
public int Age
{
get
{
return DateTime.Today.Year - _dob.Year;
}
}
OnPropertyChanged()
适用于出生日期,但要通知年龄更改,我应该记得在DateOfBirth
的二传手内呼叫OnPropertyChanged("Age")
。我觉得这使得代码随着时间的推移难以维护。如果新属性依赖于年龄,则还需要在出生日期的设置器中通知。有没有更好的方法可以在不调用OnPropertyChanged("Age")的情况下做到这一点?
只要您的依赖属性在同一个类中,您就可以使用 Poma 的方法,但如果依赖属性在不同的类中,则使用这种方法会变得更加困难。
在我看来,从概念上讲,正确的做法是添加一个 PropertyChanged 侦听器。
在这种情况下,这将是类似的
在构造函数中:
this.PropertyChanged += new PropertyChangedEventHandler(SubPropertyChanged);
而在外面:
private void SubPropertyChanged(object sender, PropertyChangedEventArgs e)
{
if (e.PropertyName == "DateOfBirth")
{
OnPropertyChanged("Age");
}
}
如果您在完全不同的地方有一个依赖属性,并且您无法再更改源类,这也有效。
一种方法是定义您的属性并在OnPropertyChanged
中做一些反射以通知所有依赖属性。您可能希望缓存属性以仅在类初始值设定项中使用反射,因为反射非常慢。
private DateTime _dob;
public DateTime DateOfBirth
{
get
{
return _dob;
}
private set
{
_dob = value;
OnPropertyChanged();
}
}
[DependsOnProperty("DateOfBirth")]
public int Age
{
get
{
return DateTime.Today.Year - _dob.Year;
}
}