WPF通知PropertyChanged获取属性

Car*_*ine 4 c# wpf inotifypropertychanged callermembername

我已经INotifyPropertyChanged实现了CallerMemberName

public event PropertyChangedEventHandler PropertyChanged;

protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
 if (PropertyChanged != null)
    {
        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,可以在任何属性的设置器中将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;
    }
}
Run Code Online (Sandbox Code Playgroud)

OnPropertyChanged()对于DateOfBirth可以正常使用,但是要通知Age更改,我应该记得OnPropertyChanged("Age")在的setter中进行调用DateOfBirth。我觉得这使得代码很难随时间进行维护。如果新属性取决于年龄,则还需要在DateOfBirth的设置器中进行通知。有没有更好的方法可以执行此操作而无需调用OnPropertyChanged(“ Age”)?

bla*_*lar 5

只要您的从属属性在同一类中,就可以使用Poma的方法,但是如果从属属性在不同的类中,则使用该方法会变得更加困难。

我认为在概念上正确的做法是添加一个PropertyChanged侦听器。

在这种情况下,

在构造函数中:

this.PropertyChanged += new PropertyChangedEventHandler(SubPropertyChanged);
Run Code Online (Sandbox Code Playgroud)

外面:

private void SubPropertyChanged(object sender, PropertyChangedEventArgs e)
{
    if (e.PropertyName == "DateOfBirth")
    {
       OnPropertyChanged("Age");
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您在某个地方具有完全不同的从属属性,并且无法再更改源类,那么这也将起作用。


Pom*_*oma -4

一种方法是定义您的属性并进行一些反射以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;
    }
}
Run Code Online (Sandbox Code Playgroud)