Работает ли привязка ТОЛЬКО с DependencyProperty?

MSDN сообщает:

  • Каждая привязка обычно имеет следующие четыре компонента: цель привязки объект, целевое свойство, привязка источник и Путь к значению в источник привязки для использования. Например, если вы хотите связать содержимое TextBox в свойство Name объекта Объект сотрудника, ваш целевой объект TextBox, целевое свойство свойство Text , используемое значение Имя, а исходный объект - это Объект Employee.

  • Целевое свойство должно быть свойством зависимости.

Вышеупомянутый отрывок объясняет, почему работает следующий код:


Он работает, потому что Текст является свойством зависимости. До этого момента все в порядке!


Мой вопрос:

Если свойство target должно быть свойством зависимости для Binding , чтобы работать, тогда как работает следующий Setter ? Обратите внимание, что Value в Setter НЕ является свойством зависимости!



У меня есть объяснение. Но я не уверен, что это правильно. Позвольте мне сначала объяснить это, а потом, ребята, поправьте меня, если я ошибаюсь. : -)

Я думаю, поскольку тип из Value равен Object , это означает, что он может содержать экземпляры ЛЮБОГО типа. Он может содержать экземпляр даже типа Binding. Однако он не может принимать участие в процессе оценки (или разрешения) выражения Binding, поскольку это не свойство зависимости. Таким образом, объект Style просто передает этот объект Binding (который содержит Value) из Setter в TextBox как таковой, без оценки / разрешения значения Binding. Таким образом, вышеуказанный Setter становится эквивалентным этому:

 Text="{Binding EmployeeName}"

И поскольку теперь Text является свойством зависимости, он может разрешать значение Binding. Итак, сначала кажется, что целью привязки является Value, но на самом деле целью привязки является Text.

Это похоже на то, что Setter - это почтальон, само Value - это сумка почтальона, экземпляр Binding (то есть то, что содержит Value) это письмо. Почтальон (то есть сеттер) доставляет письмо (то есть экземпляр привязки) к цели (то есть свойство текста) не открывая его, т.е. не зная, какое сообщение (например, EmployeeName) содержит письмо.

Пожалуйста, поправьте меня, если я ошибаюсь.

11
задан Nawaz 17 March 2011 в 20:19
поделиться