2009-04-01 2 views
20

Имея {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.

+0

Используется логическое дерево. Будет опубликован подробнее. – alex2k8

ответ

6

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

Не найти элемент с именем «граница» в ControlTemplate, но изменение ELEMENTNAME в LabelBar, обязательными к «buttonFoo» делает зеленый фон, как и ожидалось.

0

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

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

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

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

»... свойство ElementName является одним из способов, вы можете явно задать источник имеющего обязательную юридическую силу и переопределить унаследованное данные контекст «.

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

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


См. Data Binding Overview для получения дополнительной информации.

 Смежные вопросы

  • Нет связанных вопросов^_^