如何为派生类实现INotifyPropertyChanged?

时间:2014-05-10 05:08:35

标签: c# wpf xaml windows-phone-8 windows-runtime

我有一个基类:

public class PersonBaseClass : INotifyPropertyChanged
{
    private string name;
    public string Name
    {
        get { return name; }
        set
        {
            if (value != name)
            {
                name = value;
                NotifyPropertyChanged("Name");
            }
        }
    }
}

和派生类

public class TeacherClass : PersonBaseClass, INotifyPropertyChanged
{
    private string id;
    public string Id
    {
        get { return id; }
        set
        {
            if (value != id)
            {
                id = value;
                NotifyPropertyChanged("Id");
            }
        }
    }
}

这个神奇的代码在每一个结尾!

    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged(String propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (null != handler)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }

然后我在xaml的列表中显示Teachers集合的列表。现在,如果我更改Id,则会为用户显示更改,但不会显示基类中属性Name中的更改。在调试中,我看到在设置Name值后,handler内部NotifyPropertyChanged方法为空,这似乎是问题所在。

如何解决基类更改也会出现在列表中?

2 个答案:

答案 0 :(得分:7)

只有PersonBaseClass实现INotifyPropertyChanged并使NotifyPropertyChange成为受保护的,因此您可以从子类中调用它。不需要两次实现它。这也应该解决问题。

答案 1 :(得分:2)

您的“魔术代码”部分应该只在PersonBaseClass中。您可以使NotifyPropertyChanged函数受到保护,以便也可以从TeacherClass调用相同的函数。