Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Normalmente, los desarrolladores declaran los enlaces directamente en el marcado XAML de los elementos de la interfaz de usuario a los que quieren enlazar datos. Sin embargo, también puede declarar enlaces en el código. En este artículo se describe cómo declarar enlaces tanto en XAML como en código.
Prerrequisitos
Antes de leer este artículo, es importante que esté familiarizado con el concepto y el uso de extensiones de marcado. Para obtener más información sobre las extensiones de marcado, consulta Extensiones de marcado y XAML de WPF.
En este artículo no se tratan los conceptos de enlace de datos. Para obtener una explicación de los conceptos de enlace de datos, consulte Introducción al enlace de datos.
Declaración de un enlace en XAML
Binding es una extensión de marcado. Cuando se usa la extensión de enlace para declarar un enlace, la declaración consta de una serie de cláusulas después de la Binding
palabra clave y separadas por comas (,). Las cláusulas en la declaración vinculante pueden estar en cualquier orden y hay muchas combinaciones posibles. Las cláusulas son pares Nombre=valor , donde Name es el nombre de la Binding propiedad y Value es el valor que se va a establecer para la propiedad.
Cuando se crean cadenas de declaraciones de enlace en el marcado, deben adjuntarse a la propiedad de dependencia específica del objeto de destino. En el ejemplo siguiente se muestra cómo enlazar la TextBox.Text propiedad mediante la extensión de enlace, especificando las Source propiedades y Path .
<TextBlock Text="{Binding Source={StaticResource myDataSource}, Path=Name}"/>
En el ejemplo anterior se usa un tipo de objeto de datos simple de Person
. El fragmento de código siguiente es el código de ese objeto:
class Person
{
public string Name { get; set; }
public DateTime Birthdate { get; set; }
}
Public Class Person
Public Property Name As String
Public Property Birthdate As DateTime
End Class
Puede especificar la mayoría de las propiedades de la Binding clase de esta manera. Para obtener más información sobre la extensión de enlace y para obtener una lista de Binding propiedades que no se pueden establecer mediante la extensión de enlace, consulte la información general sobre la extensión de marcado de enlace (.NET Framework).
Para obtener un ejemplo sobre cómo crear un enlace en XAML, consulta Cómo crear un enlace de datos.
Sintaxis del elemento Object
La sintaxis del elemento object es una alternativa a la creación de la declaración de enlace. En la mayoría de los casos, no hay ninguna ventaja específica al usar la extensión de código o la sintaxis del elemento de objeto. Sin embargo, cuando la extensión de marcado no admite su escenario, como cuando el valor de propiedad es de un tipo que no es de cadena para el que no existe ninguna conversión de tipos, debe usar la sintaxis del elemento de objeto.
En la sección anterior se mostró cómo enlazar con una extensión XAML. En el ejemplo siguiente se muestra cómo realizar el mismo enlace, pero se usa la sintaxis del elemento object:
<TextBlock>
<TextBlock.Text>
<Binding Source="{StaticResource myDataSource}" Path="Name"/>
</TextBlock.Text>
</TextBlock>
Para obtener más información sobre los distintos términos, consulta Sintaxis XAML en detalle (.NET Framework).
MultiBinding y PriorityBinding
MultiBinding y PriorityBinding no admiten la sintaxis de la extensión XAML. Por eso debes usar la sintaxis del elemento de objeto si estás declarando un MultiBinding o un PriorityBinding en XAML.
Creación de un enlace en el código
Otra manera de especificar un enlace es establecer propiedades directamente en un Binding objeto en el código y, a continuación, asignar el enlace a una propiedad. En el ejemplo siguiente se muestra cómo crear un Binding objeto en el código.
private void Window_Loaded(object sender, RoutedEventArgs e)
{
// Make a new data source object
var personDetails = new Person()
{
Name = "John",
Birthdate = DateTime.Parse("2001-02-03")
};
// New binding object using the path of 'Name' for whatever source object is used
var nameBindingObject = new Binding("Name");
// Configure the binding
nameBindingObject.Mode = BindingMode.OneWay;
nameBindingObject.Source = personDetails;
nameBindingObject.Converter = NameConverter.Instance;
nameBindingObject.ConverterCulture = new CultureInfo("en-US");
// Set the binding to a target object. The TextBlock.Name property on the NameBlock UI element
BindingOperations.SetBinding(NameBlock, TextBlock.TextProperty, nameBindingObject);
}
Private Sub Window_Loaded(sender As Object, e As RoutedEventArgs)
' Make a new data source object
Dim personDetails As New Person() With {
.Name = "John",
.Birthdate = Date.Parse("2001-02-03")
}
' New binding object using the path of 'Name' for whatever source object is used
Dim nameBindingObject As New Binding("Name")
' Configure the binding
nameBindingObject.Mode = BindingMode.OneWay
nameBindingObject.Source = personDetails
nameBindingObject.Converter = NameConverter.Instance
nameBindingObject.ConverterCulture = New CultureInfo("en-US")
' Set the binding to a target object. The TextBlock.Name property on the NameBlock UI element
BindingOperations.SetBinding(NameBlock, TextBlock.TextProperty, nameBindingObject)
End Sub
El código anterior estableció lo siguiente en el enlace:
- Ruta de acceso de la propiedad en el objeto de origen de datos.
- Modo del enlace.
- El origen de datos, en este caso, una instancia de objeto simple que representa a una persona.
- Convertidor opcional que procesa el valor procedente del objeto de origen de datos antes de asignarlo a la propiedad de destino.
Cuando el objeto que está enlazando es un FrameworkElement o un FrameworkContentElement, puede llamar directamente al método SetBinding
en su objeto en lugar de usar BindingOperations.SetBinding. Para obtener un ejemplo, vea Cómo: Crear una vinculación en código.
En el ejemplo anterior se usa un tipo de objeto de datos simple de Person
. A continuación se muestra el código de ese objeto:
class Person
{
public string Name { get; set; }
public DateTime Birthdate { get; set; }
}
Public Class Person
Public Property Name As String
Public Property Birthdate As DateTime
End Class
Sintaxis de ruta de vinculación
Use la Path propiedad para especificar el valor de origen al que desea enlazar:
En el caso más sencillo, el valor de la propiedad Path es el nombre de la propiedad del objeto de origen que se va a usar para la vinculación, como
Path=PropertyName
.Las subpropiedades de una propiedad se pueden especificar mediante una sintaxis similar a en C#. Por ejemplo, la cláusula
Path=ShoppingCart.Order
establece el enlace a la subpropiedadOrder
del objeto o propiedadShoppingCart
.Para enlazar a una propiedad adjunta, coloque paréntesis alrededor de la propiedad adjunta. Por ejemplo, para enlazar a la propiedad DockPanel.Dockadjunta , la sintaxis es
Path=(DockPanel.Dock)
.Los indexadores de una propiedad se pueden especificar entre corchetes después del nombre de propiedad donde se aplica el indexador. Por ejemplo, la cláusula
Path=ShoppingCart[0]
establece el enlace al índice que corresponde al modo en que la indexación interna de la propiedad controla la cadena literal "0". También se admiten indexadores anidados.Los indizadores y las subpropiedades se pueden mezclar en una
Path
cláusula; por ejemplo,Path=ShoppingCart.ShippingInfo[MailingAddress,Street].
Dentro de los indexadores. Puede tener varios parámetros de indexador separados por comas (
,
). El tipo de cada parámetro se puede especificar entre paréntesis. Por ejemplo, puede tenerPath="[(sys:Int32)42,(sys:Int32)24]"
, dondesys
está asignado alSystem
namespace.Cuando el origen es una vista de colección, el elemento actual se puede especificar con una barra diagonal (
/
). Por ejemplo, la cláusulaPath=/
establece la vinculación 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 unaOffices
propiedad que también es una colección. Su elemento actual es un objeto que contiene unaManagerName
propiedad .Opcionalmente, se puede usar una ruta de punto (
.
) para conectar con el origen actual. Por ejemplo,Text="{Binding}"
equivale aText="{Binding Path=.}"
.
Mecanismo de escape
Dentro de los indizadores (
[ ]
), el carácter de intercalación (^
) escapa al carácter siguiente.Si estableces Path en XAML, también debes escapar (mediante entidades XML) determinados caracteres especiales para la definición del lenguaje XML:
Use
&
para escapar el carácter "&
".Use
>
para escapar de la etiqueta final ">
".
Además, si describe toda la vinculación en un atributo mediante la sintaxis de la extensión de marcado, debe escapar (mediante barras diagonales inversas
\
) caracteres especiales para el analizador de extensiones 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 la propiedad.Coma (
,
) separa las propiedades.La llave derecha (
}
) es el final de una extensión de marcado.
Dirección de los enlaces
Utilice la Binding.Mode propiedad para especificar la dirección del enlace. Los modos siguientes son las opciones disponibles para las actualizaciones de enlace:
Modo de enlace | Descripción |
---|---|
BindingMode.TwoWay | Actualiza la propiedad de destino o la propiedad cada vez que cambia la propiedad de destino o la propiedad de origen. |
BindingMode.OneWay | Actualiza la propiedad de destino solo cuando cambia la propiedad de origen. |
BindingMode.OneTime | Actualiza la propiedad de destino solo cuando se inicia la aplicación o cuando DataContext se somete a un cambio. |
BindingMode.OneWayToSource | Actualiza la propiedad de origen cuando cambia la propiedad de destino. |
BindingMode.Default | Hace que se use el valor predeterminado Mode de la propiedad de destino. |
Para obtener más información, consulte la BindingMode enumeración .
En el ejemplo siguiente se muestra cómo establecer la Mode propiedad :
<TextBlock Name="IncomeText" Text="{Binding Path=TotalIncome, Mode=OneTime}" />
Para detectar cambios en la fuente (aplicables a los enlaces OneWay y TwoWay), la fuente debe implementar un mecanismo adecuado para la notificación de cambios de propiedad, como INotifyPropertyChanged. Para obtener más información, consulte Proporcionar notificaciones de cambios.
Para TwoWay o OneWayToSource los enlaces, puede controlar el momento de las actualizaciones del origen estableciendo la propiedad UpdateSourceTrigger. Para obtener más información, consulte UpdateSourceTrigger.
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 de enlace. Si no se puede realizar una conversión, el convertidor predeterminado devuelve
null
.Si no establece ConverterCulture, el motor de enlace usa la
Language
propiedad del objeto de destino de enlace. En XAML, este valor predeterminado esen-US
o hereda el valor del elemento raíz (o cualquier elemento) de la página, si se ha establecido explícitamente uno.Siempre que el enlace ya tenga un contexto de datos (por ejemplo, el contexto de datos heredado procedente de un elemento primario) y cualquier elemento o colección que devuelva ese contexto es adecuado para el enlace sin necesidad de modificar la ruta de acceso adicional, una declaración de enlace no puede tener ninguna cláusula en absoluto:
{Binding}
. Esta suele ser la forma en que se especifica un enlace para el estilo de datos, donde el enlace actúa sobre una colección. Para obtener más información, vea Usar objetos completos como origen de enlace.El valor predeterminado Mode varía entre unidireccional y bidireccional en función de la propiedad de dependencia que se enlaza. 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 editables por el usuario, como TextBox.Text y RangeBase.Value, se usan de forma predeterminada en enlaces bidireccionales, pero la mayoría de las demás propiedades se convierten de forma predeterminada en enlaces unidireccionales.
El valor predeterminado UpdateSourceTrigger varía entre PropertyChanged y LostFocus según la propiedad de dependencia enlazada. El valor predeterminado para la mayoría de las propiedades de dependencia es PropertyChanged, mientras que la TextBox.Text propiedad tiene un valor predeterminado de LostFocus.
Consulte también
.NET Desktop feedback