Привязка 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, но также могут быть в визуальном дереве.


См. Обзор привязки данных для получения дополнительной информации.

Другие вопросы по тегам