Привязка ElementName. Использует ли он визуальное дерево или логическое дерево
Имеющий {Binding ElementName=foo}
Это будет поиск визуального или логического дерева?
Логических и визуальных деревьев в WPF | Данные видят, данные делают
Когда логическое дерево имеет значение?
При поиске имени, например, в {Binding ElementName=Foo}, поиск перебирает родословную в поисках области имен, как и для наследуемых свойств.
Связывание ElementName в Silverlight с помощью прикрепленного поведения
Для этого WPF предоставляет привязки ElementName и RelativeSource, предоставляя вам мощный механизм для поиска других элементов в вашем визуальном дереве для привязки к
РЕДАКТИРОВАТЬ:
Похоже, логическое дерево используется для связывания ElementName
,
Аргумент № 1.
Согласно статье MSDN FrameworkElement Class:
FrameworkElement расширяет UIElement и добавляет следующие возможности:
- Поддержка привязки данных и динамических ссылок на ресурсы. Поддержка на уровне свойств для привязки данных и ресурсов реализована классом DependencyProperty и реализована в системе свойств, но позволяет разрешить значение члена, которое хранится как выражение (конструкция программирования). который лежит в основе как привязки данных, так и динамических ресурсов) реализуется FrameworkElement. Для получения дополнительной информации см. Обзор привязки данных и Обзор ресурсов.
Аргумент № 2.
ElementName
указывает на x:Name
, так что это имя должно быть найдено как-то. Есть концепция NameScope.
Для большинства сценариев методы FindName, представленные в FrameworkElement и FrameworkContentElement, являются более подходящими методами для поиска элементов по имени. Свойства Name, предоставляемые FrameworkElement и FrameworkContentElement, являются более подходящими свойствами для использования для установки начального имени в качестве атрибутов разметки. А методы RegisterName, представленные в FrameworkElement и FrameworkContentElement, необходимы для установки имени в конкретную область имен (нет члена NameScope, который мог бы сделать это напрямую; сначала необходимо установить текущую область имен, чтобы использовать RegisterName).
С другой стороны, визуальный класс тоже не имеет FindName
метод, ни реализовать INameScope.
2 ответа
Я думаю, что это логическое дерево. При использовании ControlTemplates вы заменяете одно визуальное дерево другим, но я не думаю, что вы можете ссылаться на имена, определенные внутри ControlTemplate.
Например:
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Grid>
<Grid.Resources>
<ControlTemplate x:Key="Foo" TargetType="Button">
<Border x:Name="border" Background="Red">
<Label Content="{TemplateBinding Content}"></Label>
</Border>
</ControlTemplate>
</Grid.Resources>
<Grid.ColumnDefinitions>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
</Grid.ColumnDefinitions>
<Button x:Name="buttonFoo" Background="Green" HorizontalAlignment="Center" VerticalAlignment="Center" Template="{DynamicResource Foo}">Foo</Button>
<Label x:Name="labelBar" Grid.Column="1" HorizontalAlignment="Center" VerticalAlignment="Center" Background="{Binding ElementName=border, Path=Background}">Bar</Label>
</Grid>
</Page>
Не находит элемент с именем "border" в ControlTemplate, но изменение ElementName в привязке labelBar к "buttonFoo" делает фоновый зеленый, как и ожидалось.
ElementName
свойство привязки в некотором смысле (см. ответ ниже) работает вне логического дерева, потому что используется ElementName
предугадать определенный контроль исключительно на логическом дереве в Xaml.
это будет искать визуальное или логическое дерево?
Предположение, которое вы предлагаете, неверно, само по себе ни одного дерева поиска нет. Один из них - просто установить свойство Source для операции отражения, используемой привязкой, а не по умолчанию для унаследованного. DataContext
логического дерева.
Если кто-то читает документацию по свойству Binding.ElementName (System.Windows.Data) (выделение жирным шрифтом):
"... свойство ElementName является одним из способов, которым вы можете явно установить источник привязки и переопределить унаследованный контекст данных".
Источником является любой экземпляр объекта, который находится в текущем пространстве имен операций, к которому можно получить доступ и отразить его.
Не больше и не меньше, и, скорее всего, будет в логическом дереве (но не слишком), потому что люди называют там логические элементы в Xaml, но также могут быть в визуальном дереве.
См. Обзор привязки данных для получения дополнительной информации.