Ответ
INotifyPropertyChanged — это ключевой интерфейс в .NET для реализации шаблона наблюдатель (Observer) при связывании данных (Data Binding). Он позволяет объекту (например, ViewModel) уведомлять UI-слой (View) об изменении значения своего свойства, что автоматически приводит к обновлению интерфейса.
Базовая реализация:
using System.ComponentModel;
using System.Runtime.CompilerServices;
public class ProductViewModel : INotifyPropertyChanged
{
private decimal _price;
public decimal Price
{
get => _price;
set
{
// Проверка на реальное изменение значения для оптимизации
if (_price == value) return;
_price = value;
// Уведомление системы привязки данных
OnPropertyChanged();
// Можно вызвать связанные вычисления
OnPropertyChanged(nameof(PriceWithTax));
}
}
public decimal PriceWithTax => _price * 1.20m;
public event PropertyChangedEventHandler? PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string? propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
Практические советы:
- Используйте
[CallerMemberName]: Этот атрибут автоматически подставляет имя свойства, из которого был вызван метод, исключая ошибки из-за опечаток в строковых литералах. - Сравнивайте значения: Всегда проверяйте, изменилось ли значение свойства, перед вызовом
OnPropertyChanged(). Это предотвращает бесконечные циклы обновления и повышает производительность. - Уведомление для вычисляемых свойств: Если свойство
Bзависит от свойстваA, при измененииAнужно вызвать уведомление и дляB. - Библиотеки для упрощения: В больших проектах используйте
CommunityToolkit.Mvvm(атрибут[ObservableProperty]) или Fody/PropertyChanged для автоматической генерации шаблонного кода.