Подписка с INotifyPropertyChanged - QualitySolution/QSProjects GitHub Wiki
INotifyPropertyChanged интерфей реализовать от MS.
У нас имеет базовый класс позволяющий немного упростить создание полей для реализации интерфейса INotifyPropertyChanged
.
Данный базовый класс позволяет не реализовывать код вызова события. Свойства создаются максимально простым способом:
private type field;
public virtual type property
{
get => field;
set => SetField(ref field, value);
}
Метод SetField в примере выше автоматически возьмет название текущего свойства, для вызова уведомления. Они так же проверяет изменилось ли значение поля, если значение не изменилось, то событие вызвано не будет.
Для этого у базового класса есть метод OnPropertyChanged(string propertyName)
Если вызывать его из set или get свойства, то можно не указывать название свойства OnPropertyChanged()
. название будет получено автоматически с помощью атрибута [CallerMemberName]
.
Самое частое использование это передача названия свойства через nameof. Пример OnPropertyChanged(nameof(Property))
, если мы хотим откуда нибудь вручную вызвать события изменения свойства Property.
Есть так же вариант указания имени свойства через лямбду OnPropertyChanged<Entity>(x => x.Property))
.
Иногда при изменение одного хранимого свойства, так же меняются другие расчетные свойства. Для таких ситуаций проще всего использовать атрибут PropertyChangedAlsoAttribute
.
Пример кода:
private type field;
[PropertyChangedAlso(nameof(GenText1))]
[PropertyChangedAlso(nameof(GenText2))]
public virtual type Property
{
get => field;
set => SetField(ref field, value);
}
public string GenText1 => $"Значение: {Property}";
public string GenText2 => $"Данные: {Property}";
Здесь при установке свойства Property, помимо события изменения свойства Property, так же будут вызваны события изменения свойств GenText1 и GenText2