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

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

Término Descripción
{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 una clase ControlTemplate que se aplica como origen para este enlace. Esto resulta útil para aplicar información en tiempo de ejecución a enlaces en el nivel de plantilla.

Comentarios

Un enlace puede establecer Binding.RelativeSource como atributo en un elemento de 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 es similar 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 enlaza una propiedad de un elemento a otra propiedad en el mismo elemento, las propiedades deben usar el mismo tipo de propiedad o también debe usar un convertidor en el enlace 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 height 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 es como una manera de RelativeSource={RelativeSource Self} establecer 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 de 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.