Почему 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 не будет приостанавливать операцию, он немедленно выполнит изменение.