WPF - Реализация System.ComponentModel.INotifyPropertyChanged для базового класса - PullRequest
2 голосов
/ 27 ноября 2010

Я бы хотел реализовать интерфейс System.ComponentModel.INotifyPropertyChanged для свойства базового класса, но я не совсем уверен, как его подключить.

Вот подпись для свойства IЯ хочу получать уведомления для:

public abstract bool HasChanged();

И мой код в базовом классе для обработки изменений:

public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;

private void OnPropertyChanged(String info)
{
    PropertyChangedEventHandler handler = PropertyChanged;
    if (handler != null)
    {
        handler(this, new PropertyChangedEventArgs(info));
    }
}

Как мне обработать подключение события в базекласс без необходимости вызывать OnPropertyChanged () в каждом дочернем классе?

Спасибо,Сонни

РЕДАКТИРОВАТЬ: ОК ... так что я думаю, что когда значение для HasChanged () меняется, я должен вызвать OnPropertyChanged("HasChanged"), но я не уверен, как получить это в базовый класс,Есть идеи?

1 Ответ

2 голосов
/ 27 ноября 2010

Это то, что вам нужно?

public abstract class ViewModelBase : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    //make it protected, so it is accessible from Child classes
    protected void OnPropertyChanged(String info)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(info));
        }
    }

}

Обратите внимание, что доступный уровень OnPropertyChanged защищен.И затем в вашем конкретном классе или дочерних классах вы делаете:

public class PersonViewModel : ViewModelBase
{

    public PersonViewModel(Person person)
    {
        this.person = person;
    }

    public string Name
    {
        get
        {
            return this.person.Name;
        }
        set
        {
            this.person.Name = value;
            OnPropertyChanged("Name");
        }
    }
}

РЕДАКТИРОВАТЬ: после прочтения вопроса OP, я понимаю, что он не хочет вызывать OnPropertyChanged в дочернем классе, поэтомуЯ почти уверен, что это будет работать:

public abstract class ViewModelBase : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private bool hasChanged = false;
    public bool HasChanged
    {
        get
        {
            return this.hasChanged;
        }
        set
        {
            this.hasChanged = value;
            OnPropertyChanged("HasChanged");
        }
    }

    //make it protected, so it is accessible from Child classes
    protected void OnPropertyChanged(String info)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(info));
        }
    }
}

и в дочернем классе:

public class PersonViewModel : ViewModelBase
{
    public PersonViewModel()
    {
        base.HasChanged = true;
    }
}
...