Имея {Binding ElementName=foo}
, будет ли он искать визуальное или логическое дерево?Binding ElementName. Использует ли это Visual Tree или логическое дерево
Of logical and visual trees in WPF | Data See, Data Do
Когда же логическое дерево имеет значение?
При поиске имени, например, в {Binding ELEMENTNAME = Foo}, поиск подходит родословная ищет сферу в имени, опять же, как это делает для наследуемых свойств.
ElementName binding in Silverlight via Attached Behaviours
Для того, чтобы включить это, WPF предоставляет ELEMENTNAME и RelativeSource привязок, давая вам мощный механизм для размещения других элементов в пределах вашего визуального дерева связываться с
EDIT:
Похоже, что логическое дерево используется для привязки ElementName
.
Довод # 1.
Согласно статье MSDN FrameworkElement Class:
FrameworkElement расширяет UIElement и добавляет следующие возможности:
- поддержка связывания данных и ссылок динамических ресурсов: поддержка уровня собственности для данных привязка и ресурсы реализована по классу DependencyProperty и , воплощенные в системе свойств, но способность разрешать значение члена , который хранится как выражение (в программировании конструкции, которая лежит в основе как привязки данных и динамические ресурсов) реализуются с помощью FrameworkElement. Для получения дополнительной информации о см. Обзор привязки данных и Обзор ресурсов.
Довод # 2.
ElementName
указывает на x:Name
, так что это имя должно быть найдено как некоторые. Существует концепция NameScope.
Для большинства сценариев, методы FindName , выставленные на FrameworkElement и FrameworkContentElement больше соответствующих метод называющих искать для элементов по названию.Свойства , выставленные элементом FrameworkElement и FrameworkContentElement, являются более подходящими свойствами, которые можно использовать для установки начального имени в качестве атрибутов разметки. И методы RegisterName подвергаются на FrameworkElement и FrameworkContentElement необходим установить имя в определенный NameScope (нет NameScope элемента, который может сделать это напрямую, вы должны установить текущую NameScope первую использовать RegisterName) ,
С другой стороны, ни Visual class не имеют FindName
метод, ни осуществить INameScope.
Используется логическое дерево. Будет опубликован подробнее. – alex2k8