Información general sobre orígenes de enlaces

En el enlace de datos, el objeto de origen de enlace hace referencia al objeto de que se obtienen los datos. En este tema se describen los tipos de objetos que se pueden usar como origen de enlace.

Tipos de orígenes de enlace

El enlace de datos de Windows Presentation Foundation (WPF) admite los siguientes tipos de origen de enlace:

Origen de enlace Descripción
objetos de Common Language Runtime (CLR) Puede enlazar a propiedades públicas, subpropiedades e indizadores de cualquier objeto de Common Language Runtime (CLR). El motor de enlace utiliza la reflexión CLR para obtener los valores de las propiedades. Los objetos que implementan ICustomTypeDescriptor o tienen un TypeDescriptionProvider registrado también funcionan con el motor de enlace.

Para más información acerca de cómo implementar una clase que puede actuar como un origen de enlace, consulte Implementar una clase para el origen de enlace más adelante en este tema.
objetos dinámicos Puede enlazar a las propiedades e indizadores disponibles de un objeto que implementa la interfaz IDynamicMetaObjectProvider. Si se puede acceder al miembro en código, puede enlazar a él. Por ejemplo, si un objeto dinámico permite acceder a un miembro en código mediante someObject.AProperty, puede enlazar a él estableciendo el trazado de enlace en AProperty.
Objetos ADO.NET Puede enlazar a objetos ADO.NET como, por ejemplo, DataTable. El DataView de ADO.NET implementa la interfaz IBindingList, que proporciona notificaciones de cambio que el motor de enlace escucha.
Objetos XML Puede enlazar y ejecutar consultas XPath en XmlNode, XmlDocument o XmlElement. Una manera cómoda de acceder a los datos XML que son el origen de enlace en el marcado es usar un objeto XmlDataProvider. Para más información, consulte Cómo: Enlazar a datos XML mediante XMLDataProvider y consultas XPath.

También puede enlazar a un XElement o un XDocument o enlazar a los resultados de las consultas que se ejecutan en objetos de estos tipos mediante LINQ to XML. Una manera cómoda de usar LINQ to XML para acceder a los datos XML que son el origen de enlace en el marcado es usar un objeto ObjectDataProvider. Para más información, consulte Cómo: Enlazar a los resultados de una consulta LINQ for XML, XDocument o XElement.
Objetos DependencyObject. Siempre puede enlazar a las propiedades de dependencia de cualquier DependencyObject. Para ver un ejemplo, consulte Cómo: Enlazar las propiedades de dos controles.

Implementar una clase para el origen de enlace

Puede crear sus propios orígenes de enlace. En esta sección se explica lo que necesita saber si está implementando una clase para que actúe como un origen de enlace.

Proporcionar notificaciones de cambios

Si está usando un enlace OneWay o TwoWay (porque quiere que la interfaz de usuario se actualice cuando cambian dinámicamente las propiedades del origen de enlace), debe implementar un mecanismo de notificación de cambio de propiedad adecuado. El mecanismo recomendado es que CLR o la clase dinámica implementen la interfaz INotifyPropertyChanged. Para más información, consulte Cómo: Implementar la notificación de cambio de propiedad.

Si crea un objeto CLR que no implementa INotifyPropertyChanged, deberá utilizar su propio sistema de notificación para asegurarse de que los datos utilizados en un enlace permanecen actuales. Puede proporcionar notificaciones de cambio admitiendo el patrón PropertyChanged para cada propiedad para la que desee cambiar las notificaciones. Para admitir este patrón, defina un evento PropertyName cambiado para cada propiedad, donde PropertyName es el nombre de la propiedad. Se genera el evento cada vez que cambia la propiedad.

Si el origen de enlace implementa uno de estos mecanismos de notificación, se producen automáticamente las actualizaciones de destino. Si, por algún motivo, el origen de enlace no proporciona las notificaciones de propiedad cambiada adecuadas, tiene la opción de usar el método UpdateTarget para actualizar la propiedad de destino de forma explícita.

Otras características

En la lista siguiente se proporcionan otros puntos importantes a tener en cuenta:

  • Si quiere crear el objeto en XAML, la clase debe tener un constructor sin parámetro. En algunos lenguajes .NET, como C#, el constructor sin parámetro puede crearse automáticamente.

  • Las propiedades que se utilizan como propiedades de origen de enlace para un enlace deben ser propiedades públicas de la clase. No se puede acceder a las propiedades de interfaz definidas explícitamente con fines de enlace, ni tampoco las propiedades protegidas, privadas, internas o virtuales que no tengan ninguna implementación base.

  • No se puede enlazar a campos públicos.

  • El tipo de la propiedad declarada en la clase es el tipo que se pasa al enlace. Sin embargo, el tipo utilizado en última instancia por el enlace depende del tipo de la propiedad de destino de enlace, no de la propiedad de origen de enlace. Si hay una diferencia en el tipo, puede escribir un convertidor para controlar cómo la propiedad personalizada se pasa inicialmente al enlace. Para obtener más información, vea IValueConverter.

Utilizar objetos completos como origen de enlace

Puede utilizar objetos completos como origen de enlace. Puede especificar un origen de enlace mediante la propiedad Source o DataContext y, a continuación, proporcionar una declaración de enlace en blanco: {Binding}. Los escenarios en los que esto resulta útil incluyen enlaces a objetos que son del tipo cadena, enlaces a objetos con varias propiedades en las que esté interesado o el enlace a objetos de la colección. Para obtener un ejemplo de enlace a un objeto de la colección completo, consulte Cómo: Usar el patrón principal-detalle con datos jerárquicos.

Observe que puede ser necesario aplicar lógica personalizada para que los datos sean significativos para la propiedad de destino enlazada. La lógica personalizada puede consistir en un convertidor personalizado (si no existe la conversión de tipos predeterminada) o en un DataTemplate. Para más información sobre los convertidores, consulte la sección de conversión de datos de Información general sobre el enlace de datos. Para más información sobre las plantillas de datos, consulte Información general sobre plantillas de datos.

Utilizar objetos de colección como origen de enlace

A menudo, el objeto que desea utilizar como origen de enlace es una colección de objetos personalizados. Cada objeto actúa como el origen para una instancia de un enlace repetido. Por ejemplo, podría tener una colección de CustomerOrders formada por objetos CustomerOrder, donde la aplicación itera en la colección para determinar cuántas órdenes hay y los datos contenidos en cada uno.

Puede enumerar en cualquier colección que implemente la interfaz IEnumerable. Pero para poder configurar enlaces dinámicos para que las inserciones o las eliminaciones en la colección actualicen la interfaz de usuario automáticamente, la colección debe implementar la interfaz INotifyCollectionChanged. Esta interfaz expone un evento que debe provocarse siempre que se realicen cambios en la colección subyacente.

La clase ObservableCollection<T> es una implementación integrada de una colección de datos que expone la interfaz INotifyCollectionChanged. Los objetos de datos individuales dentro de la colección deben cumplir los requisitos descritos en las secciones anteriores. Para ver un ejemplo, consulte Cómo: Crear y enlazar a una colección ObservableCollection. Antes de implementar su propia colección, considere la posibilidad de usar ObservableCollection<T> o una de las clases de colección existentes, como List<T>, Collection<T> y BindingList<T>, entre muchas otras.

WPF nunca se enlaza directamente a una colección. Si especifica una colección como origen de enlace, WPF se enlaza en realidad a la vista predeterminada de la colección. Para más información sobre las vistas predeterminadas, consulte Información general sobre el enlace de datos.

Si tiene un escenario avanzado y desea implementar su propia colección, considere el uso de la interfaz IList. IList proporciona una colección no genérica de objetos a los que se puede acceder individualmente por índice, lo que puede mejorar el rendimiento.

Requisitos de permisos en el enlace de datos

Cuando se enlazan los datos, debe tener en cuenta el nivel de confianza de la aplicación. La tabla siguiente resume qué tipos de propiedad se pueden enlazar en una aplicación que se ejecuta en plena confianza o en confianza parcial:

Tipo de propiedad

(todos los modificadores de acceso)
Propiedad de objeto dinámico Propiedad de objeto dinámico Propiedad CLR Propiedad CLR Propiedad de dependencia Propiedad de dependencia
Nivel de confianza Plena confianza Confianza parcial Plena confianza Confianza parcial Plena confianza Confianza parcial
Clase pública
Clase no pública No No

En esta tabla se describen los siguientes puntos importantes acerca de los requisitos de permisos en el enlace de datos:

  • Para las propiedades CLR, el enlace de datos funciona siempre que el motor de enlace tenga acceso a la propiedad de origen de enlace mediante la reflexión. De lo contrario, el motor de enlace emite una advertencia que indica que no se encuentra la propiedad y utiliza el valor de reserva o el valor predeterminado, si está disponible.

  • Puede enlazar a propiedades en objetos dinámicos que se definen en tiempo de compilación o tiempo de ejecución.

  • Siempre puede enlazar a propiedades de dependencia.

El requisito de permiso para el enlace XML es similar. En un espacio aislado de confianza parcial, XmlDataProvider produce un error cuando no tiene permiso para acceder a los datos especificados.

Los objetos con un tipo anónimo son internos. Puede enlazar a propiedades de tipos anónimos solo cuando se ejecutan en plena confianza. Para más información acerca de los tipos anónimos, consulte Tipos anónimos (Guía de programación de C#) o Tipos anónimos (Visual Basic) (Visual Basic).

Para más información sobre la seguridad de confianza parcial, consulte Seguridad de confianza parcial de WPF.

Vea también