我使用INotifyPropertyChanged
CallerMemberName
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
所以这可以在任何属性的setter中调用 - OnPropertyChanged()
,它会在设置时通知属性更改事件。对于仅属于getter的属性,情况并非如此。例如,
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")
的设置者中调用DateOfBirth
。我觉得这会使代码难以维持。如果新属性依赖于Age,则还需要在DateOfBirth的setter中进行Notified。如果没有调用OnPropertyChanged(" Age"),有没有更好的方法呢?
答案 0 :(得分:4)
只要您的依赖属性属于同一个类,您就可以使用Poma的方法,但如果依赖属性在不同的类中,则使用该方法会变得更难。
在我看来,概念上正确的做法是添加一个PropertyChanged监听器。
在这种情况下,就像
在构造函数中:
this.PropertyChanged += new PropertyChangedEventHandler(SubPropertyChanged);
外面:
private void SubPropertyChanged(object sender, PropertyChangedEventArgs e)
{
if (e.PropertyName == "DateOfBirth")
{
OnPropertyChanged("Age");
}
}
如果您的依赖属性完全不同,并且您不能再更改源类,那么这也适用。
答案 1 :(得分:-3)
一种方法是定义属性并在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;
}
}