Вот случай:Привязка к предку, украшенного элемент
<DataTemplate x:Key="ItemTemplate"
DataType="local:RoutedCustomCommand">
<Button Command="{Binding}"
Content="{Binding Text}"
ToolTip="{Binding Description}">
<Button.Visibility>
<MultiBinding Converter="{StaticResource SomeConverter}">
<!-- Converter simply checks flags matching
and returns corresponding Visibility -->
<Binding Path="VisibilityModes" />
<!-- VisibilityModes is a property of local:RoutedCustomCommand -->
<Binding Path="CurrentMode"
RelativeSource="{RelativeSource AncestorType=local:CustomControl}" />
<!-- CurrentMode is a property of local:CustomControl -->
</MultiBinding>
<Button.Visibility>
</Button>
</DataTemplate>
<local:CustomControl>
<!-- ... -->
<ToolBar ...
Width="15"
ItemTemplate={StaticResource ItemTemplate}
... />
<!-- Take a look at Width - it's especially is set to such a value
which forces items placement inside adorner overflow panel -->
<!-- If you change ToolBar to ItemsControl, items won't be wrapped by adorner
panel and everything will be OK -->
<!-- ... -->
</local:CustomControl>
В нескольких словах: когда некоторый элемент находится внутри Adorner, вы не можете просто использовать RelativeSource свойства связывания для доступа к элементам внутри украшенных визуальное дерево.
Я уже использовал, чтобы столкнуться с той же проблемой с ToolTip, когда мне нужно было связать свой FontSize с владельцем инструментального средства FontSize - было очень удобное свойство PlacementTarget, и мне не нужно было искать внутри дерева - привязка выглядела так: <Binding PlacementTarget.FontSize />
Здесь почти та же проблема - когда элемент находится внутри ToolBarOverflowPanel, он оказывается внутри adorner, поэтому RelativeSource, очевидно, не удается связать.
Вопрос в том, как решить эту сложную проблему? Мне действительно нужно привязываться к свойству контейнера. Даже если бы я мог привязываться к украшенному элементу, также остается длинный путь к предку.
UPD: самый неприятный побочный эффект в том, что команда не достигают намеченной цели - распространения команд через механизм барботирования останавливается при визуальном корня Adorner в :( Спецификация явной цели работает в одной и той же задачи - цель есть. чтобы быть внутри визуального дерева local:CustomControl
«s, которое не может быть достигнуто с помощью одной и той же RelativeSource связывания
UPD2:. добавляя визуальные и логические деревья результатов обхода:
UPD3: удалены старые результаты обхода. Добавлено более точное обхождение:
UPD4: (надеюсь, что этот окончательный вариант). Прослеживаемое визуальное дерево логических родителей:
VisualTree
System.Windows.Controls.Button
System.Windows.Controls.ContentPresenter
System.Windows.Controls.Primitives.ToolBarOverflowPanel inherits from System.Windows.Controls.Panel
LogicalTree
System.Windows.Controls.Border
Microsoft.Windows.Themes.SystemDropShadowChrome inherits from System.Windows.Controls.Decorator
System.Windows.Controls.Primitives.Popup
System.Windows.Controls.Grid
logical root: System.Windows.Controls.Grid
System.Windows.Controls.Border
LogicalTree
Microsoft.Windows.Themes.SystemDropShadowChrome inherits from System.Windows.Controls.Decorator
System.Windows.Controls.Primitives.Popup
System.Windows.Controls.Grid
logical root: System.Windows.Controls.Grid
Microsoft.Windows.Themes.SystemDropShadowChrome inherits from System.Windows.Controls.Decorator
LogicalTree
System.Windows.Controls.Primitives.Popup
System.Windows.Controls.Grid
logical root: System.Windows.Controls.Grid
System.Windows.Documents.NonLogicalAdornerDecorator inherits from System.Windows.Documents.AdornerDecorator
LogicalTree
logical root: System.Windows.Controls.Decorator
System.Windows.Controls.Decorator
visual root: System.Windows.Controls.Primitives.PopupRoot inherits from System.Windows.FrameworkElement
LogicalTree
System.Windows.Controls.Primitives.Popup
VisualTree
System.Windows.Controls.Grid
System.Windows.Controls.Grid
here it is: System.Windows.Controls.ToolBar
System.Windows.Controls.Grid
logical root: System.Windows.Controls.Grid
Заранее благодарен!
Поскольку маршрутизация событий не работает, вы можете подумать о том, что ваши отдельные кнопки TooBar не являются частью вашего основного логического дерева. Это, конечно же, повлияет на наследование DataContext так, как вы описываете. Поэтому я бы разбил программу в отладчике и проверил логическое дерево (у меня есть класс-оболочка для этого, который предназначен для использования с браузером VS.NET, или вы можете использовать Mole). –
Спасибо за совет, но я уже сделал это, прежде чем задавать вопрос. Причина, по которой я не упоминал обход, - это то, что я не нашел там ничего полезного. Я обновил свой вопрос с результатами обхода. – archimed7592
ОК, я в конце концов обнаружил, что ToolBar пересекает сначала визуальное дерево с Button, затем логическое дерево от найденного визуального предка PopupRoot и, наконец, визуальное дерево от найденного логического предка Popup. Проблема все еще сохраняется - как мы привязываемся к тому, что доступно странным образом предкам. – archimed7592