Extensión de marcado {Binding}
Nota:
Hay disponible un nuevo mecanismo de enlace para Windows 10, que está optimizado para la productividad del desarrollador y el rendimiento. Consulte la extensión de marcado {x:Bind}.
Nota:
Para obtener información general sobre el uso del enlace de datos en la aplicación con {Binding} (y para obtener una comparación completa entre {x:Bind} y {Binding}), consulta Enlace de datos en profundidad.
La extensión de marcado {Binding} se usa para enlazar propiedades de datos en controles a valores procedentes de un origen de datos como código. La extensión de marcado {Binding} se convierte en tiempo de carga XAML en una instancia de la clase Binding . Este objeto de enlace obtiene un valor de una propiedad de un origen de datos y lo inserta en la propiedad del control . El objeto de enlace se puede configurar opcionalmente para observar los cambios en el valor de la propiedad del origen de datos y actualizarse en función de esos cambios. También se puede configurar opcionalmente para insertar cambios en el valor de control de nuevo en la propiedad de origen. La propiedad que es el destino de un enlace de datos debe ser una propiedad de dependencia. Para obtener más información, consulte Introducción a las propiedades de dependencia.
{Binding} tiene la misma prioridad de propiedad de dependencia que un valor local y el establecimiento de un valor local en código imperativo quita el efecto de cualquier {Binding} establecido en el marcado.
Uso del atributo XAML
<object property="{Binding}" .../>
-or-
<object property="{Binding propertyPath}" .../>
-or-
<object property="{Binding bindingProperties}" .../>
-or-
<object property="{Binding propertyPath, bindingProperties}" .../>
Término | Descripción |
---|---|
propertyPath | Cadena que especifica la ruta de acceso de la propiedad para el enlace. A continuación encontrará más información en la sección Ruta de acceso de la propiedad . |
bindingProperties | propName=value[, propName=value]* Una o varias propiedades de enlace que se especifican mediante una sintaxis de par nombre-valor. |
propName | Nombre de cadena de la propiedad que se va a establecer en el objeto Binding. Por ejemplo, "Converter". |
value | El valor en el que se establecerá la propiedad. La sintaxis del argumento depende de la propiedad properties de la clase Binding que se puede establecer con la sección {Binding} siguiente. |
Ruta de acceso de la propiedad
Path describe la propiedad a la que está enlazando (la propiedad de origen). Path es un parámetro posicional, lo que significa que puede usar el nombre del parámetro explícitamente ({Binding Path=EmployeeID}
) o puede especificarlo como el primer parámetro sin nombre ({Binding EmployeeID}
).
El tipo de Path es una ruta de acceso de propiedad, que es una cadena que se evalúa como una propiedad o una subpropiación de su tipo personalizado o de un tipo de marco. El tipo puede ser, pero no es necesario, un DependencyObject. Los pasos de una ruta de acceso de propiedad se delimitan por puntos (.) y puede incluir varios delimitadores para recorrer las subpropiedades sucesivas. Use el delimitador de puntos independientemente del lenguaje de programación utilizado para implementar el objeto al que se enlaza.
Por ejemplo, para enlazar la interfaz de usuario a la propiedad name de un objeto employee, la ruta de acceso de la propiedad podría ser "Employee.FirstName". Si va a enlazar un control de elementos a una propiedad que contiene los dependientes de un empleado, la ruta de acceso de la propiedad podría ser "Employee.Dependents" y la plantilla de elemento del control items se ocuparía de mostrar los elementos en "Dependientes".
Si el origen de datos es una colección, una ruta de acceso de propiedad puede especificar elementos de la colección por su posición o índice. Por ejemplo, "Teams[0]. Jugadores", donde el literal "[]" incluye el "0" que especifica el primer elemento de una colección.
Al usar un enlace ElementName a un DependencyObject existente, puede usar propiedades adjuntas como parte de la ruta de acceso de la propiedad. Para desambiguar una propiedad adjunta para que el punto intermedio del nombre de la propiedad adjunta no se considere un paso en una ruta de acceso de propiedad, coloque paréntesis alrededor del nombre de propiedad adjunta calificado por el propietario; por ejemplo, (AutomationProperties.Name)
.
Un objeto intermedio de ruta de acceso de propiedad se almacena como un objeto PropertyPath en una representación en tiempo de ejecución, pero la mayoría de los escenarios no necesitarán interactuar con un objeto PropertyPath en el código. Normalmente, puedes especificar la información de enlace que necesitas mediante XAML.
Para obtener más información sobre la sintaxis de cadena de una ruta de acceso de propiedad, las rutas de acceso de propiedades en áreas de características de animación y la construcción de un objeto PropertyPath, vea Sintaxis de ruta de acceso de propiedad.
Propiedades de la clase Binding que se puede establecer con {Binding}
{Binding} se ilustra con la sintaxis de marcador de posición bindingProperties porque hay varias propiedades de lectura y escritura de un enlace que se puede establecer en la extensión de marcado. Las propiedades se pueden establecer en cualquier orden con pares de valores propName=separados por comas. Algunas de las propiedades requieren tipos que no tienen una conversión de tipos, por lo que requieren extensiones de marcado propias anidadas dentro de {Binding}.
Propiedad | Descripción |
---|---|
Path | Consulte la sección Ruta de acceso de la propiedad anterior. |
Converter | Especifica un objeto de convertidor al que llama el motor de enlace. El convertidor se puede establecer en marcado mediante la extensión de marcado {StaticResource} para hacer referencia a ese objeto desde un diccionario de recursos. |
ConverterLanguage | Especifica la referencia cultural que va a usar el convertidor. (Si está estableciendo Convertidor. La referencia cultural se establece como un identificador basado en estándares. Para obtener más información, consulta ConverterLanguage |
ConverterParameter | Especifica un parámetro de convertidor que se puede usar en la lógica del convertidor. (Si está estableciendo Convertidor. La mayoría de los convertidores usan lógica simple que obtienen toda la información que necesitan del valor pasado para convertir y no necesitan un valor ConverterParameter . El parámetro ConverterParameter es para implementaciones de convertidor más complejas que tienen lógica condicional que claves de lo que se pasa en ConverterParameter. Puede escribir un convertidor que use valores distintos de cadenas, pero esto no es habitual, consulta Comentarios en ConverterParameter para obtener más información. |
ElementName | Especifica un origen de datos haciendo referencia a otro elemento de la misma construcción XAML que tiene una propiedad Name o un atributo x:Name. Esto suele usarse para compartir valores relacionados o usar subpropiedades de un elemento de interfaz de usuario para proporcionar un valor específico para otro elemento, por ejemplo, en una plantilla de control XAML. |
FallbackValue | Especifica un valor que se va a mostrar cuando no se puede resolver el origen o la ruta de acceso. |
Modo | Especifica el modo de enlace, como uno de estos valores: "OneTime", "OneWay" o "TwoWay". Estos corresponden a los nombres constantes de la enumeración BindingMode . El valor predeterminado es "OneWay". Tenga en cuenta que esto difiere del valor predeterminado de {x:Bind}, que es "OneTime". |
RelativeSource | Especifica un origen de datos mediante la descripción de la posición del origen de enlace en relación con la posición del destino de enlace. Esto se usa con más frecuencia en enlaces dentro de plantillas de control XAML. Establecer la extensión de marcado {RelativeSource}. |
Origen | Especifica el origen de datos del objeto. Dentro de la extensión de marcado Binding, la propiedad Source requiere una referencia de objeto, como una referencia de extensión de marcado {StaticResource}. Si no se especifica esta propiedad, el contexto de datos que actúa especifica el origen. Es más habitual no especificar un valor de origen en enlaces individuales y, en su lugar, confiar en DataContext compartido para varios enlaces. Para obtener más información, consulte DataContext o Enlace de datos en profundidad. |
TargetNullValue | Especifica un valor que se va a mostrar cuando el valor de origen se resuelve, pero es explícitamente NULL. |
UpdateSourceTrigger | Especifica el tiempo de las actualizaciones de origen de enlace. Si no se especifica, el valor predeterminado es Default. |
Nota Si vas a convertir el marcado de {x:Bind} a {Binding}, ten en cuenta las diferencias en los valores predeterminados de la propiedad Mode .
Converter, ConverterLanguage y ConverterLanguage están relacionados con el escenario de convertir un valor o tipo del origen de enlace en un tipo o valor compatible con la propiedad de destino de enlace. Para obtener más información y ejemplos, consulte la sección "Conversiones de datos" del enlace de datos en profundidad.
Nota:
A partir de Windows 10, versión 1607, el marco XAML proporciona un convertidor booleano integrado a visibility. El convertidor se asigna true al valor de enumeración Visible y false a Collapsed para que pueda enlazar una propiedad Visibility a un booleano sin crear un convertidor. Para usar el convertidor integrado, la versión mínima del SDK de destino de la aplicación debe ser 14393 o posterior. No puedes usarlo si la aplicación está destinada a versiones anteriores de Windows 10. Para obtener más información sobre las versiones de destino, consulta Version adaptive code (Código adaptativo para versiones).
Source, RelativeSource y ElementName especifican un origen de enlace, por lo que son mutuamente excluyentes.
Sugerencia Si necesita especificar una sola llave para un valor, como en Path o ConverterParameter, preceda a una barra diagonal inversa: . \{
Como alternativa, incluya toda la cadena que contiene las llaves que necesitan escape en un conjunto de comillas secundarias, por ejemplo ConverterParameter='{Mix}'
.
Ejemplos
<!-- binding a UI element to a view model -->
<Page ... >
<Page.DataContext>
<local:BookstoreViewModel/>
</Page.DataContext>
<GridView ItemsSource="{Binding BookSkus}" SelectedItem="{Binding SelectedBookSku, Mode=TwoWay}" ... />
</Page>
<!-- binding a UI element to another UI element -->
<Page ... >
<Page.Resources>
<local:S2Formatter x:Key="GradeConverter"/>
</Page.Resources>
<Slider x:Name="sliderValueConverter" ... />
<TextBox Text="{Binding Path=Value, ElementName=sliderValueConverter,
Mode=OneWay,
Converter={StaticResource GradeConverter}}"/>
</Page>
En el segundo ejemplo se establecen cuatro propiedades binding diferentes: ElementName, Path, Mode y Converter. La ruta de acceso en este caso se muestra explícitamente denominada como una propiedad Binding . La ruta de acceso se evalúa como un origen de enlace de datos que es otro objeto en el mismo árbol de objetos en tiempo de ejecución, un control deslizante denominado sliderValueConverter
.
Tenga en cuenta cómo el valor de la propiedad Converter usa otra extensión de marcado, {StaticResource}, por lo que hay dos usos de extensiones de marcado anidadas aquí. La interna se evalúa primero, por lo que una vez que se obtiene el recurso, hay un IValueConverter práctico (una clase personalizada creada por el local:S2Formatter
elemento en recursos) que el enlace puede usar.
Compatibilidad con herramientas
Microsoft IntelliSense en Microsoft Visual Studio muestra las propiedades del contexto de datos al crear {Binding} en el editor de marcado XAML. En cuanto escriba "{Binding", las propiedades de contexto de datos adecuadas para Path se muestran en la lista desplegable. IntelliSense también ayuda con las otras propiedades de Binding. Para que esto funcione, debe tener el contexto de datos o el contexto de datos en tiempo de diseño establecido en la página de marcado. Ir a definición (F12) también funciona con {Binding}. Como alternativa, puede usar el cuadro de diálogo de enlace de datos.