Подтвердить что ты не робот

Binding ElementName. Использует ли это Визуальное дерево или Логическое дерево

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

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

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

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

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

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

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

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


Подробнее см. Обзор привязки данных.