Подписка с INotifyPropertyChanged - QualitySolution/QSProjects GitHub Wiki

INotifyPropertyChanged интерфей реализовать от MS.

PropertyChangedBase

У нас имеет базовый класс позволяющий немного упростить создание полей для реализации интерфейса 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

⚠️ **GitHub.com Fallback** ⚠️