Что такое INotifyPropertyChanged

«Что такое INotifyPropertyChanged» — вопрос из категории C# Core, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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));
    }
}

Практические советы:

  1. Используйте [CallerMemberName]: Этот атрибут автоматически подставляет имя свойства, из которого был вызван метод, исключая ошибки из-за опечаток в строковых литералах.
  2. Сравнивайте значения: Всегда проверяйте, изменилось ли значение свойства, перед вызовом OnPropertyChanged(). Это предотвращает бесконечные циклы обновления и повышает производительность.
  3. Уведомление для вычисляемых свойств: Если свойство B зависит от свойства A, при изменении A нужно вызвать уведомление и для B.
  4. Библиотеки для упрощения: В больших проектах используйте CommunityToolkit.Mvvm (атрибут [ObservableProperty]) или Fody/PropertyChanged для автоматической генерации шаблонного кода.