Share via


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 del atributo XAML (modo Self)

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

Uso del atributo XAML (modo TemplatedParent)

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

Valores de XAML

Término Descripción
{RelativeSource Self} Produce 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 con otra propiedad del mismo elemento.
{RelativeSource TemplatedParent} Produce una ControlTemplate que se aplica como el origen de este enlace. Esto resulta útil para aplicar la información en tiempo de ejecución a enlaces en el nivel de plantilla.

Comentarios

Un Binding puede establecer Binding.RelativeSource como un atributo en un elemento de objeto Binding o como un componente en una extensión de marcado {Binding}. Por eso se muestran dos sintaxis de XAML diferentes.

RelativeSource es similar a Extensión de marcado {Binding}. Se trata de una extensión de marcado capaz de devolver instancias de sí misma y que admite una construcción basada en cadenas que fundamentalmente pasa un argumento al constructor. En este caso, el argumento que se pasa es el valor Mode.

El modo Self es útil para enlazar una propiedad de un elemento con otra propiedad del mismo elemento y es una variación en el enlace de ElementName, pero no requiere la definición de nombres y que luego el elemento haga referencia a sí mismo. Si vinculas una propiedad de un elemento a otra propiedad del mismo elemento, las propiedades deben usar el mismo tipo de propiedad, o debes usar también un Converter en el enlace para convertir los valores. Por ejemplo, podrías usar Height como origen de Width sin conversión, pero necesitarías un convertidor para usar IsEnabled como un origen de Visibility.

A continuación se muestra un ejemplo. Este Rectangle usa una extensión de marcado {Binding} para que su Height y Width siempre sean iguales y se represente como un cuadrado. Solo Height se establece como un valor fijo. Para este Rectangle, su valor predeterminado DataContext es null, no this. Por eso, para establecer que el origen del contexto de datos sea el propio objeto (y permitir el enlace con sus otras propiedades), empleamos el argumento RelativeSource={RelativeSource Self} 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 forma 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 de XAML para RelativeSource solo muestra 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 configura una propiedad donde el valor sea RelativeSource.