Información general sobre declaraciones de enlaces

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

Este tema contiene las secciones siguientes.

  • Requisitos previos
  • Declarar un enlace en XAML
  • Crear un enlace mediante código
  • Sintaxis de ruta de acceso enlace
  • Comportamientos predeterminados
  • Temas relacionados

Requisitos previos

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

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

Declarar un enlace en XAML

En esta sección se explica cómo declarar un enlace en XAML.

Uso de extensiones de marcado

Binding es una extensión de marcado. Cuando se utiliza la extensión de enlace para declarar un enlace, la declaración consiste en una serie de cláusulas que se sitúan tras la palabra clave Binding y están 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 valores Nombre=Valor, donde Nombre es el nombre de la propiedad Binding y Valor es el valor que se establece para la propiedad.

Al crear cadenas de declaración de enlace en el marcado, deben asociarse 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 este modo. Para obtener más información sobre la extensión de enlace y una lista de propiedades de Binding que no se pueden establecer por medio de ella, vea la información general Enlazar extensión de marcado.

Sintaxis de elementos de objeto

La sintaxis de elementos de objeto es una alternativa a la creación de la declaración de enlace. En la mayoría de los casos, utilizar la extensión de marcado o la sintaxis de elementos de objeto no aporta ninguna ventaja concreta. Sin embargo, en aquellos casos en que la extensión de marcado no admite el escenario, como cuando el tipo del valor de la propiedad no es de cadena y no existe ninguna conversión de tipos para él, es preciso utilizar la sintaxis de elementos de objeto.

A continuación, se muestra un ejemplo de sintaxis de elementos de objeto y de 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 extensiones. La declaración de enlace de la propiedad Text utiliza la sintaxis de elementos de objeto.

Para obtener información acerca de los distintos términos utilizados, vea Detalles de la sintaxis XAML.

MultiBinding y PriorityBinding

MultiBinding y PriorityBinding no admiten la sintaxis de extensión XAML. Por consiguiente, debe utilizar la sintaxis de elementos de objeto para declarar MultiBinding o PriorityBinding en XAML.

Crear un enlace mediante código

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

    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)



...


    End Sub
    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);



...


}

Si el objeto que se enlaza es FrameworkElement o FrameworkContentElement, puede llamar directamente al método SetBinding del objeto en lugar de utilizar BindingOperations.SetBinding. Para obtener un ejemplo, vea Cómo: Crear un enlace en código.

Sintaxis de ruta de acceso enlace

Utilice la propiedad Path para especificar el valor del 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 usará para el enlace, como Path=PropertyName.

  • Las subpropiedades de una propiedad se pueden especificar mediante una sintaxis parecida, como en C#. Por ejemplo, la cláusula Path=ShoppingCart.Order establece el enlace a la subpropiedad Order del objeto o la propiedad ShoppingCart.

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

  • Los indizadores de una propiedad se pueden especificar 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 corresponde a cómo se administra la cadena literal "0" en la indización interna de la propiedad. También se admiten indizadores anidados.

  • Los indizadores y las subpropiedades se pueden mezclar 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 con 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 puede especificarse con una barra diagonal (/). Por ejemplo, la cláusula Path=/ establece el enlace en el 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.

  • Se pueden combinar nombres de propiedad y barras diagonales 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.

  • Opcionalmente, se puede usar una ruta de acceso con punto (.) para enlazar al 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 (^) es el carácter de escape para el carácter siguiente.

  • Si establece Path en XAML, también deberá marcar con caracteres de escape (mediante entidades XML) algunos caracteres especiales de la definición del lenguaje XML:

    • Utilice &amp; como secuencia de escape para el carácter "&".

    • Utilice &gt; como secuencia de escape de la etiqueta de cierre">".

  • Además, si describe el enlace completo en un atributo utilizando la sintaxis de extensión de marcado, deberá utilizar un mecanismo de escape (usando la barra diagonal inversa \) para los caracteres especiales del analizador de extensión de marcado de WPF:

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

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

    • La coma (,) separa las propiedades.

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

Comportamientos predeterminados

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

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

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

  • Siempre que el enlace tenga ya un contexto de datos (por ejemplo, el contexto de datos heredado procedente de un elemento primario), y que el elemento o la colección que ese contexto devuelva sea adecuado para el enlace sin requerir ninguna modificación ulterior de la ruta, una declaración de enlace puede no tener ninguna cláusula: {Binding}. Con frecuencia, los enlaces para estilos de datos se especifican de este modo, donde el enlace actúa en una colección. Para obtener más información, vea la sección "Utilizar objetos completos como origen de enlace" en Información general sobre orígenes de enlaces.

  • El valor predeterminado de la propiedad Mode puede ser unidireccional y bidireccional, según la propiedad de dependencia que se enlace. Siempre puede declarar explícitamente el modo de enlace, para asegurarse de que su comportamiento sea el 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 de UpdateSourceTrigger varía entre PropertyChanged y LostFocus, también según 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

Referencia

Sintaxis de PropertyPath de XAML

Conceptos

Información general sobre el enlace de datos

Optimizar el rendimiento: Enlace de datos

Otros recursos

Temas "Cómo..." sobre enlace de datos

Historial de cambios

Fecha

Historial

Motivo

Septiembre de 2010

Se explica TheConverter en "Crear un enlace mediante código".

Comentarios de los clientes.