wpf binding elementname visual-tree logical-tree

wpf - Nombre de elemento vinculante. ¿Usa Visual Tree o Logical Tree?



binding elementname (2)

Creo que es un árbol lógico. Al usar 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 denominado "borde" en la Plantilla de Control, pero si se cambia el ElementName en el enlace de labelBar a "buttonFoo", el Fondo se pondrá verde, como se esperaba.

Teniendo {Binding ElementName=foo} , ¿buscará un árbol visual o lógico?

De arboles logicos y visuales en WPF | Ver datos, hacer datos

¿Cuándo importa el árbol lógico?

Al buscar un nombre, como en {Binding ElementName = Foo}, la búsqueda recorre la ascendencia en busca de un ámbito de nombre, nuevamente como lo hace para las propiedades heredables.

Enlace de ElementName en Silverlight a través de comportamientos adjuntos

Para habilitar esto, WPF proporciona enlaces ElementName y RelativeSource, lo que le brinda un mecanismo poderoso para ubicar otros elementos dentro de su árbol visual para enlazar

EDITAR:

Parece el árbol lógico utilizado para el enlace de ElementName .

Argumento # 1.

Según 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 de datos y los recursos se implementa mediante la clase DependencyProperty y se incorpora en el sistema de propiedades, pero la capacidad de resolver un valor de miembro que se almacena como una expresión (la construcción de programación que subyace tanto al enlace de datos como a los recursos dinámicos) es implementado por FrameworkElement. Para obtener más información, consulte Información general de enlace de datos y Información general de recursos.

Argumento # 2.

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

Para la mayoría de los escenarios, los métodos FindName expuestos en FrameworkElement y FrameworkContentElement son métodos más apropiados a los que llamar para buscar elementos por nombre. Las propiedades de Nombre expuestas por FrameworkElement y FrameworkContentElement son propiedades más apropiadas para usar para establecer el nombre inicial como atributos de marcado. Y los métodos RegisterName expuestos en FrameworkElement y FrameworkContentElement son necesarios para establecer un nombre en un namescope específico (no hay ningún miembro de NameScope que pueda hacer esto directamente; primero debe establecer el namescope actual para usar RegisterName).

Por otro lado, la clase Visual no tiene el método FindName , ni implementa INameScope .


La propiedad ElementName de un enlace en un sentido (ver la respuesta a continuación) funciona 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á árbol visual o lógico?

La premisa que propones es incorrecta, no hay búsqueda por sí misma en ninguno de los árboles. Uno es simplemente establecer una propiedad Fuente para la operación de reflexión utilizada por el enlace en lugar de establecer de forma predeterminada el DataContext heredado del árbol lógico.

Si uno lee la documentación de la propiedad Binding.ElementName (System.Windows.Data) (bolding mine):

"... la propiedad ElementName es una de las formas en que puede establecer explícitamente el origen de un enlace y anular el contexto de datos heredados".

La fuente es cualquier objeto instanciado que se encuentra dentro del espacio de nombres de las operaciones actuales al que se puede acceder y reflejar.

No más ni menos, y lo más probable es que esté en el árbol lógico (pero no lo tiene también) porque la gente nombra sus elementos lógicos en Xaml, pero también podría estar en el árbol visual.

Ver información general de enlace de datos para más información.