Share via


Información general sobre declaraciones de enlaces

En este tema se describen las distintas formas de declarar un enlace.

Requisitos previos

Antes de leer este tema, es importante que esté familiarizado con el concepto y el uso de las extensiones de marcado. Para más información sobre las extensiones de marcado, consulte Extensiones de marcado y XAML de WPF.

En este tema no se tratan los conceptos de enlace de datos. Para obtener una explicación de los conceptos de enlace de datos, consulte Información general sobre el enlace de datos.

Declarar un enlace en XAML

En esta sección se describe cómo declarar en XAML.

Uso de la extensión de marcado

Binding es una extensión de marcado. Cuando se utiliza la extensión de enlace para declarar un enlace, la declaración consta de una serie de cláusulas después de la palabra clave Binding y separadas por comas (,). Las cláusulas de la declaración de enlace pueden estar en cualquier orden y hay muchas combinaciones posibles. Las cláusulas son pares de Nombre=Valor donde Nombre es el nombre de la propiedad Binding y Valor es el valor que establece para la propiedad.

Al crear cadenas de declaración de enlace en el marcado, se adjuntará a la propiedad de dependencia concreta de un objeto de destino. En el ejemplo siguiente se muestra cómo enlazar la propiedad TextBox.Text mediante la extensión de enlace, especificando las propiedades Source y Path.

<TextBlock Text="{Binding Source={StaticResource myDataSource}, Path=PersonName}"/>

Puede especificar la mayoría de las propiedades de la clase Binding de esta manera. Para obtener más información sobre la extensión de enlace, así como una lista de propiedades Binding que no se pueden establecer mediante la extensión de enlace, consulte la información general de Extensión de marcado de enlace.

Sintaxis de elemento de objeto

La sintaxis de elemento de objeto es una alternativa a la creación de la declaración de enlace. En la mayoría de los casos, no hay ninguna ventaja particular para usar la extensión de marcado o la sintaxis de elemento de objeto. Sin embargo, en aquellos casos en los que la extensión de marcado no admite el escenario, como cuando el valor de la propiedad es de un tipo que no es una cadena para la que no existe conversión de tipo, debe utilizar la sintaxis de elemento de objeto.

El siguiente es un ejemplo de la sintaxis de elemento de objeto y el uso de la extensión de marcado:

<TextBlock Name="myconvertedtext"
  Foreground="{Binding Path=TheDate,
                       Converter={StaticResource MyConverterReference}}">
  <TextBlock.Text>
    <Binding Path="TheDate"
             Converter="{StaticResource MyConverterReference}"/>
  </TextBlock.Text>
</TextBlock>

En el ejemplo se enlaza la propiedad Foreground declarando un enlace mediante la sintaxis de extensión. La declaración de enlace de la propiedad Text utiliza la sintaxis de un elemento de objeto.

Para más información sobre los distintos términos, consulte Detalles de la sintaxis XAML.

MultiBinding y PriorityBinding

MultiBinding y PriorityBinding no admiten la sintaxis de la extensión XAML. Por eso debe usar la sintaxis del elemento de objeto si declara un MultiBinding o un PriorityBinding en XAML.

Crear un enlace mediante código

Otra manera de especificar un enlace consiste en establecer las propiedades directamente en un objeto Binding en el código. En el ejemplo siguiente se muestra cómo crear un objeto Binding y especificar las propiedades en el código. En este ejemplo, TheConverter es un objeto que implementa la interfaz IValueConverter.

private void OnPageLoaded(object sender, EventArgs e)
{
    // Make a new source, to grab a new timestamp
    MyData myChangedData = new MyData();

    // Create a new binding
    // TheDate is a property of type DateTime on MyData class
    Binding myNewBindDef = new Binding("TheDate");

    myNewBindDef.Mode = BindingMode.OneWay;
    myNewBindDef.Source = myChangedData;
    myNewBindDef.Converter = TheConverter;
    myNewBindDef.ConverterCulture = new CultureInfo("en-US");

      // myDatetext is a TextBlock object that is the binding target object
    BindingOperations.SetBinding(myDateText, TextBlock.TextProperty, myNewBindDef);
    BindingOperations.SetBinding(myDateText, TextBlock.ForegroundProperty, myNewBindDef);

    lbChooseCulture.SelectedIndex = 0;
}
 Private Sub OnPageLoaded(ByVal sender As Object, ByVal e As EventArgs)
     ' Make a new source, to grab a new timestamp
     Dim myChangedData As New MyData()

     ' Create a new binding
 ' TheDate is a property of type DateTime on MyData class
     Dim myNewBindDef As New Binding("TheDate")

     myNewBindDef.Mode = BindingMode.OneWay
     myNewBindDef.Source = myChangedData
     myNewBindDef.Converter = TheConverter
     myNewBindDef.ConverterCulture = New CultureInfo("en-US")

' myDatetext is a TextBlock object that is the binding target object
     BindingOperations.SetBinding(myDateText, TextBlock.TextProperty, myNewBindDef)
     BindingOperations.SetBinding(myDateText, TextBlock.ForegroundProperty, myNewBindDef)

     lbChooseCulture.SelectedIndex = 0
 End Sub

Si el objeto que está enlazando es un FrameworkElement o un FrameworkContentElement, puede llamar al método SetBinding en el objeto directamente en lugar de usar BindingOperations.SetBinding. Para obtener un ejemplo, consulte Crear un enlace mediante código.

Sintaxis de la ruta de enlace

Use la propiedad Path para especificar el valor de origen al que desea enlazar:

  • En el caso más simple, el valor de la propiedad Path es el nombre de la propiedad del objeto de origen que se utilizará para el enlace, como Path=PropertyName.

  • Se pueden especificar subpropiedades de una propiedad mediante una sintaxis similar a la de C#. Por ejemplo, la cláusula Path=ShoppingCart.Order define el enlace a la subpropiedad Order del objeto o la propiedad ShoppingCart.

  • Para enlazar a una propiedad adjunta, coloque paréntesis alrededor de esta propiedad. Por ejemplo, para enlazar a la propiedad adjunta DockPanel.Dock, la sintaxis es Path=(DockPanel.Dock).

  • Los indizadores de una propiedad pueden especificarse entre corchetes después del nombre de la propiedad donde se aplica el indizador. Por ejemplo, la cláusula Path=ShoppingCart[0] establece el enlace al índice que se corresponde a cómo la indización interna de la propiedad administra la cadena literal "0". También se admiten indizadores anidados.

  • Los indizadores y las subpropiedades se pueden combinar en una cláusula Path; por ejemplo, Path=ShoppingCart.ShippingInfo[MailingAddress,Street]..

  • Dentro de los indizadores, puede tener varios parámetros de indizador separados por comas (,). El tipo de cada parámetro se puede especificar entre paréntesis. Por ejemplo, puede tener Path="[(sys:Int32)42,(sys:Int32)24]", donde sys se asigna al espacio de nombres System.

  • Cuando el origen es una vista de colección, el elemento actual se puede especificar con una barra diagonal (/). Por ejemplo, la cláusula Path=/ establece el enlace al elemento actual de la vista. Cuando el origen es una colección, esta sintaxis especifica el elemento actual de la vista de colección predeterminada.

  • Los nombres de propiedad y las barras diagonales se pueden combinar para recorrer las propiedades que son colecciones. Por ejemplo, Path=/Offices/ManagerName especifica el elemento actual de la colección de origen, que contiene una propiedad Offices que también es una colección. Su elemento actual es un objeto que contiene una propiedad ManagerName.

  • De manera opcional, se puede usar una ruta de acceso de punto (.) para enlazar con el origen actual. Por ejemplo, Text="{Binding}" es equivalente a Text="{Binding Path=.}".

Mecanismo de escape

  • Dentro de los indizadores ([ ]), el carácter de intercalación (^) realiza el escape del carácter siguiente.

  • Si establece Path en XAML, también necesita realizar el escape (mediante entidades XML) de ciertos caracteres que son especiales para la definición del lenguaje XML:

    • Use &amp; para realizar el escape del carácter "&".

    • Use &gt; para realizar el escape de la etiqueta final >.

  • Además, si describe el enlace completo en un atributo mediante la sintaxis de extensión de marcado, deberá realizar el escape (con la barra diagonal inversa \) de los caracteres que son especiales para el analizador de extensión de marcado de WPF:

    • La barra diagonal inversa (\) es el mismo carácter de escape.

    • El signo igual (=) separa el nombre de propiedad del valor de propiedad.

    • La coma (,) separa las propiedades.

    • La llave de cierre (}) es el final de una extensión de marcado.

Comportamientos predeterminados

El comportamiento predeterminado es el siguiente si no se especifica en la declaración.

  • Se crea un convertidor predeterminado que intenta realizar una conversión de tipos entre el valor de origen de enlace y el valor de destino del enlace. Si no se puede realizar una conversión, el convertidor predeterminado devuelve null.

  • Si no establece ConverterCulture, el motor de enlace usa la propiedad Language del objeto de destino de enlace. En XAML, tiene como valor predeterminado "en-US" o hereda el valor de elemento raíz (o cualquier elemento) de la página, si se ha establecido explícitamente.

  • Siempre que el enlace ya tenga un contexto de datos (por ejemplo, el contexto de datos heredado procedente de un elemento primario) y con independencia de que el elemento o la colección que se devuelve en ese contexto sea apropiado para el enlace sin necesitar una modificación adicional de la ruta, una declaración de enlace no puede tener ninguna cláusula: {Binding} suele ser la manera en que se especifica un enlace para los estilos de datos, donde el enlace se actúa sobre una colección. Para más información, consulte la sección "Utilizar objetos completos como origen de enlace" en Información general sobre orígenes de enlaces.

  • El valor predeterminado Mode varía entre unidireccional y bidireccional, según la propiedad de dependencia que se va a enlazar. Siempre puede declarar explícitamente el modo de enlace para asegurarse de que el enlace tiene el comportamiento deseado. En general, las propiedades de control que puede modificar el usuario, como TextBox.Text y RangeBase.Value, tienen como valor predeterminado enlaces bidireccionales, mientras que la mayoría de las demás propiedades tienen como valor predeterminado enlaces unidireccionales.

  • El valor predeterminado UpdateSourceTrigger también varía entre PropertyChanged y LostFocus en función de la propiedad de dependencia enlazada. El valor predeterminado de la mayoría de las propiedades de dependencia es PropertyChanged, mientras que la propiedad TextBox.Text tiene un valor predeterminado de LostFocus.

Vea también