Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю
public interface INotifyPropertyChanged{ event PropertyChangedEventHandler PropertyChanged;}Добавьте в файл
Car.csusingusing System.ComponentModel;using System.Runtime.CompilerServices;Затем обеспечьте реализацию классом
CarINotifyPropertyChangedpublic class Car : INotifyPropertyChanged{ // Для краткости код не показан. public event PropertyChangedEventHandler PropertyChanged;}Событие
PropertyChangedPropertyChangedEventArgsPropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Model"));Первый параметр представляет собой объект, который инициирует событие. Конструктор класса
PropertyChangedEventArgsPropertyChangedEventArgsString.EmptyВы сами управляете тем, какие свойства вовлечены в процесс автоматического обновления. Автоматически обновляться будут только те свойства, которые генерируют событие
PropertyChangedsetPropertyChangedsetOnPropertyChanged()Carprotected void OnPropertyChanged([CallerMemberName] string propertyName = ""){ PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));}Модифицируйте каждое автоматическое свойство класса
CargetsetOnPropertyChanged()Idprivate int _id;public int Id{ get => _id; set { if (value == _id) return; _id = value; OnPropertyChanged(); }}Проделайте аналогичную работу со всеми остальными свойствами в классе и снова запустите приложение. Выберите автомобиль и щелкните на кнопке Change Color. Изменение немедленно отобразится в пользовательском интерфейсе. Первая проблема решена!
Использование операции nameof
В версии C# 6 появилась операция
nameofOnPropertyChanged()setpublic string Color{ get { return _color; } set { if (value == _color) return; _color = value; OnPropertyChanged(nameof(Color)); }}Обратите внимание на то, что в случае использования операции
nameof[CallerMemberName]OnPropertyChanged()nameofCallerMemberNameНаблюдаемые коллекции
Следующей проблемой, которую необходимо решить, является обновление пользовательского интерфейса при изменении содержимого коллекции, что достигается путем реализации интерфейса
INotifyCollectionChangedINotifyPropertyChangedCollectionChangedINotifyPropertyChangedINotifyCollectionChangedsetCollectionChangedИспользование класса ObservableCollection<T>
К счастью, существует намного более легкий способ, чем создание собственных классов коллекций. Класс
ObservableCollection<T>INotifyCollectionChangedINotifyPropertyChangedCollection<T>usingSystem.Collections.ObjectModel_cars