Связывание WPF с PlacementTarget и RelativeSource - PullRequest
8 голосов
/ 16 февраля 2011

Можете ли вы объяснить следующий код WPF:

DataContext="{Binding Path=PlacementTarget,RelativeSource={x:Static RelativeSource.Self}}">

Я нахожу это крайне запутанным.Что такое цель размещения и каков относительный источник?

Ответы [ 3 ]

13 голосов
/ 16 февраля 2011

Это похоже на хак, который используется для popup-элементов, таких как ContextMenus и Popup -windows.
Проблема с этими элементами в том, что они отключены от визуального дерева вашего окна.Поэтому DataContext недоступен.PlacementTarget - это ссылка на элемент визуального дерева.
В основном вы найдете путь привязки привязки, например PlacementTarget.Tag, где в элементе source свойство Tag было установлено на DataContext, нов некоторых ситуациях сам элемент также имеет смысл, например, в вашем примере.

Предполагая, что вышеуказанный код используется в ToolTip или ContextMenu, для DataContext будет установлен элемент управления, который «владеет» элементом.сообщение от (Gishu +1) для объяснения механики.

9 голосов
/ 16 февраля 2011

Каждый FrameworkElement имеет DataContext, который является произвольным объектом. Источником по умолчанию для привязки данных является DataContext. Вы можете использовать RelativeSource.Self, чтобы изменить источник привязки к самому FrameworkElement вместо DataContext. Таким образом, часть RelativeSource просто перемещает вас «на один уровень» с DataContext из FrameworkElement до самого FrameworkElement. Как только вы окажетесь на FrameworkElement, вы можете указать путь к любому из его свойств. Если FrameworkElement является Popup, у него будет свойство PlacementTarget, которое является другим FrameworkElement, к которому относится Popup относительно.

Короче говоря, если у вас есть Popup, размещенный, например, относительно TextBox, это выражение устанавливает DataContext из Popup в TextBox и в результате {Binding Text} где-то в тело Popup будет привязано к тексту TextBox.

6 голосов
/ 16 февраля 2011

Это связывает DataContext объекта (элемент управления пользовательского интерфейса? Нужно видеть больше фрагмента кода) со своим собственным значением свойства PlacementTarget.

RelativeSource используется для указания источникаобъект относительно цели привязки.Свойство path указывает имя свойства исходного объекта.

...