2009-04-01 12 views
20

Al tener {Binding ElementName=foo}, buscará un árbol visual o lógico?Enlace ElementName. ¿Utiliza Visual Tree o Logical Tree

Of logical and visual trees in WPF | Data See, Data Do

Cuando me importa el árbol lógico?

Cuando se busca un nombre, como por ejemplo en {Binding ElementName = Foo}, la búsqueda camina hacia la estirpe buscando un alcance nombre, de nuevo justo como lo hace para propiedades heredables.

ElementName binding in Silverlight via Attached Behaviours

Para permitir esto, WPF proporciona ElementName y RelativeSource fijaciones, que le da un poderoso mecanismo para localizar otros elementos dentro de su árbol visual para unirse a

EDITAR:

Parece que el Árbol lógico utilizado para el enlace por ElementName.

Argumento # 1.

De acuerdo con el artículo de MSDN FrameworkElement Class:

FrameworkElement extiende UIElement y agrega las siguientes capacidades:

  • Soporte para el enlace de datos y referencias de recursos dinámicos: El soporte de nivel de propiedad para el enlace y los recursos de datos es implementado por la clase DependencyProperty y incorporado en el sistema de propiedad, pero la capacidad de resolver un valor miembro que se almacena como una expresión (el constructo programación que subyace ambas enlace de datos y dinámicos recursos) se implementa por FrameworkElement. Para obtener más información sobre , consulte Información general sobre enlaces de datos y descripción general de recursos.

Argumento # 2.

ElementName puntos a x:Name, por lo que este nombre se debe encontrar alguna forma. Hay un concepto NameScope.

Para la mayoría de los escenarios, los métodos expuestos en FindName FrameworkElement y FrameworkContentElement son más métodos apropiados para llamar a buscar de elementos por nombre.Las propiedades de Nombre expuestas por FrameworkElement y FrameworkContentElement son más propiedades apropiadas para usar para establecer el nombre inicial como atributos de marcado. y los métodos RegisterName expuestos en FrameworkElement y FrameworkContentElement es necesario para establecer un nombre en un NameScope específica (no hay NameScope miembro que puede hacer esto directamente, se debe establecer el NameScope actual primer utilizar RegisterName) .

Por otra parte, tampoco tienen Visual classFindName método, ni aplicar INameScope.

+0

Árbol lógico utilizado. Publicará detalles más tarde. – alex2k8

Respuesta

6

Creo que es un árbol lógico. Cuando utilizo ControlTemplates, está reemplazando un árbol visual por otro, pero no creo que pueda hacer referencia a los nombres definidos dentro de ControlTemplate.

Por ejemplo:

<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> 

no encuentra el elemento llamado "frontera" en el ControlTemplate, pero cambiando ElementName en LabelBar de unión a "buttonFoo" hace que el Fondo Verde, como se esperaba.

0

El ElementName propiedad de un unión en un sentido (véase más adelante respuesta) trabaja fuera del árbol lógico porque uno está utilizando ElementName para adivinar un control específico únicamente en el árbol lógico en el XAML.

¿Buscará un árbol visual o lógico?

La premisa que se propone está mal, no hay de búsqueda per se a cada árbol. Una es simplemente establecer una propiedad Source para la operación de reflexión utilizada por el enlace en lugar de predeterminar al DataContext heredado del árbol lógico.

Si uno lee la documentación de Binding.ElementName Property (System.Windows.Data) (negrita mía):

" ... la propiedad ElementName es una de las formas que se pueden establecer explícitamente la fuente de encuadernación y sobreescribir los datos heredados contexto."

la fuente es cualquier objeto instanciado que está dentro del espacio de nombres operaciones de corriente que se puede acceder y se refleja fuera de.

ni más ni menos, y muy probablemente habrá en el Árbol Lógico (pero no tiene demasiado) porque la gente nombre artículos allí lógicas en XAML, pero también podrían estar en el árbol visual.


Ver Data Binding Overview para obtener más información.