Compartir a través de


Extensión de marcado {RelativeSource}

Proporciona un medio para especificar el origen de un enlace en términos de una relación relativa en el gráfico de objetos en tiempo de ejecución.

Uso de atributos XAML (modo auto)

<Binding RelativeSource="{RelativeSource Self}" .../>
-or-
<object property="{Binding RelativeSource={RelativeSource Self} ...}" .../>

Uso de atributos XAML (modo TemplatedParent)

<Binding RelativeSource="{RelativeSource TemplatedParent}" .../>
-or-
<object property="{Binding RelativeSource={RelativeSource TemplatedParent} ...}" .../>

Valores XAML

Término Description
{RelativeSource Self} Genera un valor mode de Self. El elemento de destino debe usarse como origen para este enlace. Esto resulta útil para enlazar una propiedad de un elemento a otra propiedad en el mismo elemento.
{RelativeSource TemplatedParent} Genera un ControlTemplate que se aplica como origen para esta vinculación. Esto resulta útil para aplicar información en tiempo de ejecución a enlaces en el nivel de plantilla.

Observaciones

Un Binding puede establecer Binding.RelativeSource como atributo en un objeto Binding o como componente dentro de una extensión de marcado {Binding}. Este es el motivo por el que se muestran dos sintaxis XAML diferentes.

RelativeSource se asemeja a la extensión de marcado {Binding}. Es una extensión de marcado que es capaz de devolver instancias de sí misma y admitir una construcción basada en cadenas que básicamente pasa un argumento al constructor. En este caso, el argumento que se pasa es el valor Modo.

El modo Self es útil para enlazar una propiedad de un elemento a otra propiedad en el mismo elemento y es una variación en el enlace ElementName , pero no requiere nomenclatura y, a continuación, hacer referencia automática al elemento. Si vincula una propiedad de un elemento a otra propiedad en el mismo elemento, las propiedades deben utilizar el mismo tipo de propiedad, o también debe usar un convertidor en la vinculación para convertir los valores. Por ejemplo, podría usar Height como origen para Width sin conversión, pero necesitaría un convertidor para usar IsEnabled como origen para Visibility.

Este es un ejemplo. Este rectángulo usa una extensión de marcado {Binding} para que su Alto y Ancho sean siempre iguales y se represente como un cuadrado. Solo la altura se establece como un valor fijo. Para este rectángulo , su dataContext predeterminado es NULL, no esto. Por lo tanto, para establecer el origen de contexto de datos para que sea el propio objeto (y habilitar el enlace a sus otras propiedades), usamos el RelativeSource={RelativeSource Self} argumento en el uso de la extensión de marcado {Binding}.

<Rectangle
  Fill="Orange" Width="200"
  Height="{Binding RelativeSource={RelativeSource Self}, Path=Width}"
/>

Otro uso de RelativeSource={RelativeSource Self} es como una manera de establecer el DataContext de un objeto en sí mismo. Por ejemplo, puede ver esta técnica en algunos de los ejemplos del SDK en los que la clase Page se ha ampliado con una propiedad personalizada que ya proporciona un modelo de vista listo para usar para su propio enlace de datos, como: <common:LayoutAwarePage ... DataContext="{Binding DefaultViewModel, RelativeSource={RelativeSource Self}}">

Nota El uso xaml para RelativeSource muestra solo el uso para el que está previsto: establecer un valor para Binding.RelativeSource en XAML como parte de una expresión de enlace. Teóricamente, otros usos son posibles si se establece una propiedad donde el valor es RelativeSource.