Привязка ElementName. Использует ли он визуальное дерево или логическое дерево - PullRequest
20 голосов
/ 01 апреля 2009

Имея {Binding ElementName=foo}, это будет искать визуальное или логическое дерево?

Логических и визуальных деревьев в WPF | Данные см., Данные Do

Когда имеет значение логическое дерево?

При поиске имени, например, в {Binding ElementName = Foo}, поиск идет по наследству в поисках имя области, опять же, как это делается для наследуемые свойства.

Связывание ElementName в Silverlight с помощью прикрепленного поведения

Чтобы включить это, 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 член, который может сделать это напрямую; вы должен сначала установить текущую область имен использовать RegisterName).

С другой стороны, Визуальный класс не имеет ни метода FindName, ни реализует INameScope .

Ответы [ 2 ]

6 голосов
/ 22 мая 2009

Я думаю, что это логическое дерево. При использовании 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" делает зеленый фон, как и ожидалось.

0 голосов
/ 06 июля 2016

Свойство ElementName привязки в некотором смысле (см. Ответ ниже) работает на основе логического дерева, поскольку используется ElementName для определения конкретного элемента управления исключительно на логическом дереве в Xaml.

это будет искать визуальное или логическое дерево?

Предположение, которое вы предлагаете, неверно, поиск как таковой не существует ни на одном дереве. Один из них - просто установить свойство Source для операции отражения, используемой привязкой, вместо значения по умолчанию унаследованного DataContext логического дерева.

Если читать документацию Свойство Binding.ElementName (System.Windows.Data) (выделение жирным шрифтом):

"... свойство ElementName является одним из способов явной установки source привязки и переопределения унаследованного контекста данных."

Источником является любой экземплярный объект , который находится в текущем пространстве имен операций, к которому можно получить доступ и отразить его.

Не больше, не меньше и, скорее всего, будет в логическом дереве (но не слишком), потому что люди называют логические элементы в Xaml, но также могут быть в визуальном дереве. *


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

...