2010-11-30 3 views
11

MSDN says,Работает ли привязка только с DependencyProperty?

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

  • Объект target должен быть зависимым.

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

<TextBox Text="{Binding EmployeeName}"> 

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


Мой вопрос,

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

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

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

Я думаю, что, так как типа из Значение является Object, что означает, что он может содержать экземпляры любого типа. Он может содержать экземпляр типа «Тип привязки». Он, однако, не может участвовать в процессе оценки (или разрешения) выражения Binding, поскольку он не является свойством зависимостей. Таким образом, объект Style просто переносит этот объект привязки (которое имеет значение) из Setter в TextBox как таковой, не оценивая/не изменяя значение привязки. Как таковой выше сеттер становится эквивалентно следующему:

Text="{Binding EmployeeName}" 

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

Это как сеттер почтальон, сама ценность - это почта почтальона, обязательный экземпляр (т. Е. Какое значение имеет значение) - это письмо. Почтальон (т. Е. Сеттер) доставляет письмо (например, экземпляр привязки) к объекту Target (т.е. свойство Text), не открывая его, i.e, не зная, какое сообщение (т.е. EmployeeName) несет письмо.

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

+0

Действительно ли это работает? Я попытался сделать что-то подобное с стилями TreeViewItem, но это не так. – 2010-11-30 17:51:40

+0

В Silverlight я имею в виду. WPF поддерживает привязки определений в стилях. – 2010-11-30 17:52:17

+0

@Lex Lavnikov .... Недавно я не проверял себя в Silverlight, я не помню, использовал ли я привязку в стиле Silverlight. Во всяком случае, вы можете начать другой поток, чтобы обсудить это. Что ты говоришь? – Nawaz 2010-11-30 18:23:06

ответ

4

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

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

2

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

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

internal void ApplyBinding(DependencyObject target, DependencyProperty property) 

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

Смежные вопросы