Связывание работает ТОЛЬКО с DependencyProperty? - PullRequest
11 голосов
/ 30 ноября 2010

MSDN говорит:

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

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

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

<TextBox Text="{Binding EmployeeName}">

Он работает, потому что Text является свойством зависимости.До этого момента все было хорошо!


Мой вопрос:

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

<Style TargetType="{x:Type TextBox}">
      <Setter Property="Text" Value="{Binding EmployeeName}"/>
</Style>

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

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

 Text="{Binding EmployeeName}"

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

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

Ответы [ 2 ]

4 голосов
/ 30 ноября 2010

XAML устанавливает Setter.Value для объекта типа Binding. Созданный таким образом Style затем устанавливает свойство зависимости Text для целевого объекта равным этому Binding, так что привязка будет обновлять Text при каждом изменении свойства источника.

Если бы Setter.Value было свойством зависимости, то установщик в конечном итоге стал бы посредником в уведомлении об изменении свойства: свойство источника изменяется, привязка уведомляет установщик, установщик уведомляет цель. Поскольку это просто свойство CLR, установщик фактически не участвует в уведомлении об изменениях: свойство источника изменяется, а привязка уведомляет цель.

2 голосов
/ 30 ноября 2010

Это верно. Если вы посмотрите на исходный код WPF toolkit , вы увидите, как это делается. DataGrid делает это в нескольких местах (например, в определенных столбцах, передающих привязку Content к ячейке). Я постараюсь не забыть добавить ссылку на определенный файл и строку, где это делается после работы.

Редактировать Хорошим примером является свойство Binding в классе DataGridBoundColumn . Вы можете увидеть это используется в

internal void ApplyBinding(DependencyObject target, DependencyProperty property)

Если вам интересны расширенные шаблоны для создания элементов управления WPF и Silverlight, я настоятельно рекомендую просмотреть их соответствующие наборы инструментов. В целом они хорошо прокомментированы, а некоторые элементы управления используют какой-то классный код.

...