Compartir a través de


RelativeSource MarkupExtension

Especifica las propiedades de un RelativeSource origen de enlace, que se usarán dentro de una extensión de marcado de enlace o al establecer la RelativeSource propiedad de un Binding elemento establecido en XAML.

Uso de atributos XAML

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

Uso de atributos XAML (anidado en la extensión Binding)

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

Uso de elementos de objeto XAML

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

-o-

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

Valores XAML

Importancia Descripción
modeEnumValue Uno de los siguientes:

- El token de cadena Self; corresponde a un RelativeSource creado con su propiedad Mode establecida en Self.
- El token de cadena TemplatedParent; corresponde a un RelativeSource creado con su propiedad Mode establecida en TemplatedParent.
- El token de cadena PreviousData; corresponde a un RelativeSource creado con su propiedad Mode establecida en PreviousData.
- Consulte a continuación para obtener información sobre el modo FindAncestor.
FindAncestor Token de cadena FindAncestor. Al utilizar este token, se activa un modo en el que se especifica un tipo antecesor RelativeSource y, opcionalmente, un nivel antecesor. Esto corresponde a un RelativeSource creado con su propiedad Mode establecida en FindAncestor.
typeName Necesario en el modo FindAncestor. El nombre de un tipo, que rellena la propiedad AncestorType.
intLevel Opcional para el modo FindAncestor. Nivel antecesor (evaluado hacia la dirección primaria en el árbol lógico).

Observaciones

{RelativeSource TemplatedParent} Los usos de enlace son una técnica clave que aborda un concepto mayor de la separación de la interfaz de usuario de un control y la lógica de un control. Esto permite el enlace desde dentro de la definición de plantilla al elemento primario con plantilla (la instancia de objeto en tiempo de ejecución donde se aplica la plantilla). En este caso, la extensión de marcado TemplateBinding es en realidad una abreviatura de la siguiente expresión de enlace: {Binding RelativeSource={RelativeSource TemplatedParent}}. TemplateBinding o {RelativeSource TemplatedParent} los usos solo son relevantes dentro del XAML que define una plantilla. Para obtener más información, vea TemplateBinding Markup Extension.

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

En la sintaxis del elemento de objeto para el modo FindAncestor que se muestra en las secciones de Sintaxis XAML, la segunda sintaxis del elemento de objeto se utiliza específicamente para el modo FindAncestor. FindAncestor modo requiere un valor AncestorType. Debe establecer AncestorType como un atributo mediante una referencia de Extensión de Marcado x:Type al tipo de antecesor que desea encontrar. El AncestorType valor se usa cuando la solicitud de enlace se procesa en tiempo de ejecución.

Para el modo FindAncestor, la propiedad opcional AncestorLevel puede ayudar a desambiguar la búsqueda de ancestros en casos donde posiblemente haya más de uno de ese tipo existente en el árbol de elementos.

Para obtener más información sobre cómo usar el FindAncestor modo , 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 propiedad de dependencia general (como la coerción) entre esas dos propiedades. Aunque es raro que dos propiedades existan en un objeto de modo que los valores sean literalmente idénticos (y tienen un tipo idéntico), también puede aplicar un Converter parámetro a un enlace que tenga {RelativeSource Self}y usar el convertidor para convertir entre tipos de origen y de destino. Otro escenario para {RelativeSource Self} es como parte de un MultiDataTrigger.

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

{RelativeSource PreviousData} es útil en las plantillas de datos o en los casos en los que los enlaces usan una colección como origen de datos. Puede usar {RelativeSource PreviousData} para resaltar las relaciones entre los elementos de datos adyacentes de la colección. Una técnica relacionada consiste en establecer un vínculo entre los elementos actuales y anteriores del origen de datos y usar un convertidor sobre ese vínculo para determinar la diferencia entre los dos elementos y sus propiedades.

En el ejemplo siguiente, el primero TextBlock de la plantilla de elementos muestra el número actual. El segundo TextBlock enlace es un MultiBinding que nominalmente tiene dos Binding componentes: el registro actual y un enlace que usa deliberadamente el registro de datos anterior mediante {RelativeSource PreviousData}. A continuación, un convertidor en 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 enlace de datos como concepto no se trata aquí, consulte Introducción al enlace de datos.

En la implementación del procesador XAML de WPF, el manejo de esta extensión de marcado está definido por la clase RelativeSource.

RelativeSource es una extensión de marcado. Las extensiones de marcado normalmente se implementan cuando hay un requisito de escape de valores de atributo que no sean valores literales o nombres de controlador, y el requisito es más global que simplemente colocar convertidores de tipos en determinados tipos o propiedades. Todas las extensiones de marcado en XAML usan los { caracteres y } en su sintaxis de atributo, que es la convención por la que un procesador XAML reconoce que una extensión de marcado debe procesar el atributo. Para obtener más información, consulta Extensiones de marcado y XAML de WPF.

Consulte también