Почему WPF привязывает дескрипторы INotifyPropertyChanged двумя разными способами?

Недавно я узнал, что wpf обрабатывает INotifyPropertyChanged двумя разными способами. Я просто хочу знать, в чем причина.

Возьмем нормальную привязку twoway с подтверждением true.

если вы установите свойство из ui в viewmodel, оно будет выглядеть следующим образом.

  • запущен вызов setter
  • значение
  • Началась инициализация INotifyPropertyChanged
  • Выполнен INotifyPropertyChanged
  • setter done
  • getter вызван и сделан
  • Вызывается и выполняется идентификатор IDataErrorInfo

но если вы установите свойство в своей модели просмотра, оно будет выглядеть следующим образом

  • запущен вызов setter
  • значение
  • Началась инициализация INotifyPropertyChanged
  • getter вызван и сделан
  • Вызывается и выполняется идентификатор IDataErrorInfo
  • Выполнен INotifyPropertyChanged
  • setter done

Ответ 1

Изменение свойства из UI в ViewModel может привести к ситуации взаимоблокировки, которая может привести к менее рекурсивным вызовам в двух сценариях. Чтобы блокировать это, когда WPF вносит изменения в модель, он будет продолжать отслеживать изменения через INotifyPropertyChanged, но это изменение будет поставлено в очередь в очереди диспетчера, и оно будет выполнено после завершения текущего обновления.

Поскольку изменение в viewmodel не инициируется WPF, WPF не будет приостанавливать операцию, он немедленно выполнит изменение.