Мне нравится думать о связывании данных как о старшем брате. Система Binding настраивает себя на просмотр всех своих различных зарегистрированных Bindings, и когда соответствующие критерии (например, FocusLost или PropertyChanged) выполнены, система Binding копирует исходное значение в цель. Для привязки TwoWay или OneWayToSource система Binding даже скопирует данные из целевого объекта в исходный, если найдутся правильные критерии.
Цель должна быть DependencyProperty, так как это особый вид свойства, который знает, как зависеть от других значений. XAML {Binding}
делает под прикрытием создание нового BindingExpression, а затем вызывает BindingOperations.SetBinding, который регистрирует конкретное BindingExpression в Binding System, поэтому он знает, как наблюдать и выполнять обновления.
Преимущество этого состоит в том, что ни цель, ни источник не должны брать на себя ответственность за написание кода для явного обновления другого. Если у меня есть код, который знает, как предоставить список цветов, почему меня должно волновать, как цвета будут представлены пользователю? Поскольку система привязки заботится о привязке, для меня не имеет значения, является ли цель, использующая мои цвета, списком, деревом или любым другим объектом, который знает, как обрабатывать список элементов. Я могу сосредоточиться на том, что мне небезразлично (публичный интерфейс, который я раскрываю), и мне не нужно заботиться о беспорядочных деталях склеивания этого интерфейса с чем-то другим.