繁体   English   中英

WPF通知PropertyChanged获取Get属性

[英]WPF Notify PropertyChanged for a Get Property

我使用CallerMemberName实现了INotifyPropertyChanged

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,但是为了通知Age更改,我应该记得在DateOfBirth的setter中DateOfBirth OnPropertyChanged("Age") 我觉得这会使代码难以维持。 如果新属性依赖于Age,则还需要在DateOfBirth的setter中进行Notified。 如果没有调用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;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM