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