Extensión de marcado RelativeSource

Especifica las propiedades de un origen de enlace de RelativeSource, para su uso en una Extensión de marcado de enlace, o al establecer la propiedad RelativeSource de un elemento Binding establecido en XAML.

Uso de atributos XAML

<Binding RelativeSource="{RelativeSource modeEnumValue}" ... />

Uso de atributos XAML (anidados en la extensión de enlace)

<object property="{Binding RelativeSource={RelativeSource modeEnumValue} ...}" ... />

Uso de elementos de objeto XAML

<Binding>
  <Binding.RelativeSource>
    <RelativeSource Mode="modeEnumValue"/>
  </Binding.RelativeSource>
</Binding>

O bien

<Binding>
  <Binding.RelativeSource>
    <RelativeSource
      Mode="FindAncestor"
      AncestorType="{x:Type typeName}"
      AncestorLevel="intLevel"
    />
  </Binding.RelativeSource>
</Binding>

Valores XAML

Value Descripción
modeEnumValue Uno de los siguientes:

- El token de cadena Self; corresponde a un objeto RelativeSource creado con su propiedad Mode establecida en Self.
- El token de cadena TemplatedParent; corresponde a un objeto RelativeSource creado con su propiedad Mode establecida en TemplatedParent.
- El token de cadena PreviousData; corresponde a un objeto RelativeSource creado con su propiedad Mode establecida en PreviousData.
Vea más adelante la información sobre el modo FindAncestor.
FindAncestor El token de cadena FindAncestor. Al utilizar este token, se entra en un modo en que RelativeSource especifica un tipo de antecesor y, opcionalmente, un nivel del antecesor. Corresponde a un RelativeSource creado con su propiedad Mode establecida en FindAncestor.
typeName Necesario para el modo FindAncestor. El nombre de un tipo, que rellena la propiedad AncestorType.
intLevel Opcional para el modo FindAncestor. Un nivel del antecesor (se evalúa en la dirección del elemento primario en el árbol lógico).

Comentarios

Los usos de enlace de {RelativeSource TemplatedParent} son una técnica clave que aborda un concepto más amplio de la separación de la interfaz de usuario y la lógica de un control. Esto permite enlazar desde dentro de la definición de plantilla al elemento primario con plantilla (instancia de objeto en tiempo de ejecución donde se aplica la plantilla). Para este caso, la Extensión de marcado TemplateBinding es, de hecho, una abreviación de la expresión de enlace siguiente: {Binding RelativeSource={RelativeSource TemplatedParent}}. El uso de TemplateBinding o {RelativeSource TemplatedParent} solo es relevante dentro del código XAML que define una plantilla. Para obtener más información, consulte Extensión de marcado TemplateBinding.

{RelativeSource FindAncestor} se usa principalmente en las plantillas de control o las composiciones autónomas predecibles de la interfaz de usuario, para los casos en que siempre se espera que un control esté en un árbol visual de un tipo de antecesor determinado. Por ejemplo, los elementos de un control de elementos pueden usar FindAncestor para enlazar a propiedades del antecesor del elemento primario del control de elementos. O bien los elementos que forman parte de la composición de controles en una plantilla pueden usar enlaces FindAncestor a los elementos primarios en esa misma estructura de composición.

En la sintaxis de elementos de objeto para el modo FindAncestor que se muestra en las secciones sobre sintaxis XAML, la segunda sintaxis de elementos de objeto se emplea específicamente para el modo FindAncestor. El modo FindAncestor necesita un valor de AncestorType. Debe establecer AncestorType como atributo utilizando una referencia de x:Type (Extensión de marcado) al tipo de antecesor que se desea buscar. Se utiliza el valor de AncestorType al procesar la solicitud de enlace en tiempo de ejecución.

Para el modo FindAncestor, la propiedad AncestorLevel opcional puede ayudar a eliminar la ambigüedad en la búsqueda del antecesor en aquellos casos en que sea posible que exista más de un antecesor de ese tipo en el árbol de elementos.

Para obtener más información sobre cómo usar el modo FindAncestor, vea RelativeSource.

{RelativeSource Self} es útil para escenarios en los que una propiedad de una instancia debe depender del valor de otra propiedad de la misma instancia y no existe ninguna relación de propiedades de dependencia general (como la conversión) entre esas dos propiedades. Aunque no es habitual que existan dos propiedades en un objeto de modo que los valores sean literalmente idénticos (y con el mismo tipo), también puede aplicar un parámetro Converter a un enlace que tenga {RelativeSource Self} y utilizar el convertidor para realizar la conversión entre los tipos de origen y destino. Otro escenario para {RelativeSource Self} forma parte de MultiDataTrigger.

Por ejemplo, el código XAML siguiente define un elemento Rectangle de forma que, independientemente del valor que se especifique para Width, Rectangle sea siempre un cuadrado: <Rectangle Width="200" Height="{Binding RelativeSource={RelativeSource Self}, Path=Width}" .../>

{RelativeSource PreviousData} es útil en las plantillas de datos o en casos donde los enlaces utilizan una colección como origen de datos. Puede utilizar {RelativeSource PreviousData} para resaltar las relaciones entre los elementos de datos adyacentes de la colección. Una técnica relacionada es establecer un objeto MultiBinding entre los elementos actual y anterior del origen de datos, y utilizar un convertidor en dicho enlace para determinar la diferencia entre ambos elementos y sus propiedades.

En el ejemplo siguiente, el primer TextBlock de la plantilla de elementos muestra el número actual. El segundo enlace TextBlock es un MultiBinding que tiene nominalmente dos componentes Binding: el registro actual y un enlace que usa de forma deliberada el registro de datos anterior mediante {RelativeSource PreviousData}. A continuación, un convertidor en el objeto MultiBinding calcula la diferencia y la devuelve al enlace.

<ListBox Name="fibolist">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
            <TextBlock Text="{Binding}"/>
            <TextBlock>, difference = </TextBlock>
                <TextBlock>
                    <TextBlock.Text>
                        <MultiBinding Converter="{StaticResource DiffConverter}">
                            <Binding/>
                            <Binding RelativeSource="{RelativeSource PreviousData}"/>
                        </MultiBinding>
                    </TextBlock.Text>
                </TextBlock>
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

La descripción del concepto de enlace de datos no se incluye aquí; consulte Introducción al enlace de datos.

La clase RelativeSource define el control para esta extensión de marcado en la implementación del procesador XAML de WPF.

RelativeSource es una extensión de marcado. Las extensiones de marcado se suelen implementar cuando se necesita que los valores de los atributos de escape no sean valores literales o nombres de controladores, y este requisito es de índole más global que limitarse a colocar los convertidores de tipos en determinados tipos o propiedades. Todas las extensiones de marcado de XAML utilizan los caracteres { y } en su sintaxis de atributo, que es la convención que permite que un procesador de XAML reconozca que el atributo se debe procesar mediante una extensión de marcado. Para más información, vea Extensiones de marcado y XAML de WPF.

Consulte también