WPF-реализующая система.ComponentModel.INotifyPropertyChanged для базового класса
Я хотел бы внедрить эту систему.ComponentModel.INotifyPropertyChanged интерфейс для свойства в базовом классе, но я не совсем уверен, как его подключить.
Вот подпись для свойства, для которого я хотел бы получать уведомления:
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 ответ:
Это то, что вы после?
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"); } } }
EDIT: прочитав вопрос OP еще раз, я понимаю, что он не хочет вызывать
OnPropertyChanged
в классе child, поэтому я почти уверен, что это сработает: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; } }