Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю
private readonly IList<Car> _cars =
new ObservableCollection<Car>();
Снова запустите приложение и щелкните на кнопке Add Car. Новые записи будут должным образом появляться.
Реализация флага изменения
Еще одним преимуществом наблюдаемых моделей является способность отслеживать изменения состояния. Отслеживать флаги изменения (т.е. когда изменяется одно и более значений объекта) в WPF довольно легко. Добавьте в класс
Car
bool
IsChanged
set
OnPropertyChanged()
Car
private bool _isChanged;
public bool IsChanged {
get => _isChanged;
set
{
if (value == _isChanged) return;
_isChanged = value;
OnPropertyChanged();
}
}
Свойство
IsChanged
true
OnPropertyChanged()
IsChanged
true
OnPropertyChanged()
nameof
protected virtual void OnPropertyChanged(
[CallerMemberName] string propertyName = "")
{
if (propertyName != nameof(IsChanged))
{
IsChanged = true;
}
PropertyChanged?.Invoke(this,
new PropertyChangedEventArgs(propertyName));
}
Откройте файл
MainWindow.xaml
DetailsGrid
RowDefinition
Grid
Label
Checkbox
IsChanged
<Label Grid.Column="0" Grid.Row="5" Content="Is Changed"/>
<CheckBox Grid.Column="1" Grid.Row="5" VerticalAlignment="Center"
Margin="10,0,0,0" IsEnabled="False" IsChecked="{Binding Path=IsChanged}" />
Если вы запустите приложение прямо сейчас, то увидите, что каждая отдельная запись отображается как измененная, хотя пока ничего не изменялось! Дело в том, что во время создания объекта устанавливаются значения свойств, а установка любых значений приводит к вызову метода
OnPropertyChanged()
IsChanged
IsChanged
false
MainWindow.xaml.cs
_cars.Add(
new Car {Id = 1, Color = "Blue", Make = "Chevy",
PetName = "Kit", <b>IsChanged = false</b>});
_cars.Add(
new Car {Id = 2, Color = "Red", Make = "Ford",
PetName = "Red Rider", <b>IsChanged = </b>
<b>false</b>});
Снова запустите приложение, выберите автомобиль и щелкните на кнопке Change Color. Флажок Is Changed (Изменено) становится отмеченным наряду с изменением цвета.
Обновление источника через взаимодействие с пользовательским интерфейсом
Во время выполнения приложения можно заметить, что при вводе в текстовых полях флажок Is Changed не становится отмеченным до тех пор, пока фокус не покинет элемент управления, где производился ввод. Причина кроется в свойстве
UpdateSourceTrigger
TextBox
Свойство
UpdateSourceTrigger
UpdateSourceTrigger

Стандартным событием обновления для элементов управления
TextBox
LostFocus
PropertyChanged
TextBox
<TextBox Grid.Column="1" Grid.Row="2" Text="{Binding Path=Color,
UpdateSourceTrigger=PropertyChanged}" />
Если вы запустите приложение и начнете ввод в текстовом поле Color (Цвет), то флажок Is Changed немедленно отметится. Может возникнуть вопрос о том, почему для элементов управления
TextBox
LostFocus
UpdateSourceTrigger
TextBox
TextBox
TextBox