Как работает биндинг в WPF
Что проверяют
Понимаете ли вы механику: что с чем связывается, откуда берётся источник и как изменения доходят до экрана. Следом обычно спрашивают, почему не обновляется UI, или просят объяснить UpdateSourceTrigger.
Как отвечать
Биндинг связывает свойство-цель на элементе с путём к данным в источнике. Цель обязательно DependencyProperty, источник может быть любым CLR-объектом. На каждую привязку WPF создаёт BindingExpression, которая подписывается на изменения и переносит значение.
- источник: по умолчанию
DataContext, который наследуется вниз по дереву элементов. Явно источник указывают черезElementName,RelativeSource(FindAncestor,TemplatedParent) илиSource; - уведомления: чтобы изменение модели дошло до UI, источник реализует
INotifyPropertyChanged, а коллекцияINotifyCollectionChanged, обычно этоObservableCollection<T>; - режимы:
OneWay,TwoWay,OneTime,OneWayToSourceиDefault. Режим по умолчанию задан в метаданных свойства: уTextBox.TextэтоTwoWay, у большинства остальныхOneWay; UpdateSourceTrigger: когда значение уходит в источник. УTextBox.Textпо умолчаниюLostFocus, для обновления на каждый символ нуженPropertyChanged;- преобразование:
IValueConverter,MultiBindingсIMultiValueConverter,StringFormat,FallbackValue,TargetNullValue; - валидация:
INotifyDataErrorInfoилиValidationRule.
Ошибки привязки исключений не бросают: они пишутся в окно Output, а в Visual Studio есть окно XAML Binding Failures. Для подробной трассировки ставят PresentationTraceSources.TraceLevel=High.
Где спотыкаются
Реализуют INotifyPropertyChanged, но передают имя свойства строкой с опечаткой. Надёжнее nameof или [CallerMemberName].
Меняют коллекцию из фонового потока и получают NotSupportedException. Изменения нужно вернуть в UI-поток через Dispatcher или включить BindingOperations.EnableCollectionSynchronization.
Привязываются к свойству объекта без INotifyPropertyChanged. WPF тогда подписывается через PropertyDescriptor с сильной ссылкой, и объект может не освободиться: классическая утечка памяти в WPF.