【发布时间】:2014-03-13 15:24:07
【问题描述】:
我使用CallerMemberName 实现了INotifyPropertyChanged
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
因此,这可以在任何属性的设置器中调用 - 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,但要通知 Age 已更改,我应该记得在 DateOfBirth 的设置器中调用 OnPropertyChanged("Age")。我觉得这使得代码随着时间的推移难以维护。如果一个新属性依赖于年龄,那也需要在 DateOfBirth 的设置器中通知。有没有更好的方法可以在不调用 OnPropertyChanged("Age") 的情况下做到这一点?
【问题讨论】:
-
这个
OnPropertyChanged()只适用于setter 吗?如果没有,您可以尝试将return语句放在try-finally 中,然后在那里调用OnPropertyChanged()。 -
能否详细说明。 OnPropertyChanged 始终有效,但只有在有人更改值时才应通知它。因此,将它放在 setter 中是有意义的。我不明白我在哪里以及为什么需要最后尝试?
-
如果您不想调用
OnPropertyChanged("Age"),在设置DOB值时将“年龄”作为参数,在Age's get上您可以返回try内的值,在finally内,您可以调用OnPropertyChanged(),不带参数。 -
这行不通。我使用 OnPropertyChanged 的原因是,如果有人更改 DOB,OnPropertyChanged 将触发 UI 访问 Get of Age。如果我在 Get of Age 中移动 OnpropertyChanged,它将进入无限循环,一次又一次地尝试访问 get 并获得更改的通知。
-
Guilherme 的 cmets 完全没有意义。属性通知显然需要在设置、不获取和尝试/最终实现任何目标时进行(除了触发事件,即使 getter 中有异常,这很奇怪)。
标签: c# wpf inotifypropertychanged callermembername