¿Qué son los orígenes de enlace? (WPF .NET)
En el enlace de datos, el objeto de origen de enlace hace referencia al objeto de que se obtienen los datos. En este artículo se describen los tipos de objetos que puede usar como origen de enlace, como objetos CLR de .NET, XML y objetos DependencyObject.
Tipos de orígenes de enlace
El enlace de datos de Windows Presentation Foundation (WPF) admite los siguientes tipos de origen de enlace:
Objetos .NET 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 un origen de enlace en los objetos, 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 enAProperty
.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 Enlazar a datos XML mediante XMLDataProvider y consultas XPath (.NET Framework).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 Enlazar a XDocument, XElement o LINQ para resultados de consultas XML.
DependencyObject objetos
Siempre puede enlazar a las propiedades de dependencia de cualquier DependencyObject. Para ver un ejemplo, consulte Enlazar las propiedades de dos controles (.NET Framework).
Implementación de un origen de enlace en los objetos
Los objetos CLR pueden convertirse en orígenes de enlace. Hay algunas cosas que debe tener en cuenta al implementar una clase para que actúe como origen de enlace.
Proporcionar notificaciones de cambios
Si usa enlaces OneWay o TwoWay, implemente un mecanismo de notificación adecuado de «propiedad cambiada». El mecanismo recomendado es que CLR o la clase dinámica implementen la interfaz INotifyPropertyChanged. Para obtener más información, consulte Cómo: Implementar notificaciones de propiedad cambiada (.NET Framework).
Hay dos maneras de notificar a un suscriptor una propiedad cambiada:
Implemente la interfaz INotifyPropertyChanged.
Este es el mecanismo recomendado para las notificaciones. El INotifyPropertyChanged proporciona el evento PropertyChanged, que el sistema de enlace respeta. Al generar este evento y proporcionar el nombre de la propiedad que ha cambiado, notificará a un destino de enlace del cambio.
Implemente el patrón
PropertyChanged
.Cada propiedad que necesita notificar que ha cambiado a un destino de enlace tiene un evento correspondiente
PropertyNameChanged
, dondePropertyName
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, puede 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:
Los objetos de datos que actúan como orígenes de enlace se pueden declarar en XAML como recursos siempre que tengan un constructor sin parámetros. De lo contrario, se debe crear el objeto de datos en el código y asignarlo directamente al contexto de datos del árbol de objetos XAML o como origen de enlace del enlace.
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 de manera explícita con fines de enlace, ni tampoco las propiedades protegidas, privadas, internas o virtuales que no tengan 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, se puede escribir un convertidor para controlar cómo se pasa inicialmente la propiedad personalizada al enlace. Para obtener más información, vea IValueConverter.
Objetos completos como origen de enlace
Puede utilizar objetos completos como origen de enlace. Especifique un origen de enlace mediante la propiedad Source o DataContext y, a continuación, proporcione 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 completo de colección, consulte Cómo usar el patrón principal-detalle con datos jerárquicos (.NET Framework).
Puede ser necesario aplicar lógica personalizada para que los datos sean significativos para la propiedad de destino enlazada. La lógica personalizada puede tener la forma de un convertidor personalizado o un DataTemplate. Consulte Conversión de datos para obtener más información sobre los convertidores. Para obtener más información sobre las plantillas de datos, consulte Información general sobre plantillas de datos (.NET Framework).
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 orden.
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 obtener un ejemplo, consulte Cómo crear y enlazar a un ObservableCollection (.NET Framework). 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.
Cuando se especifica una colección como origen de enlace, WPF no se enlaza directamente a la colección. En su lugar, WPF se enlaza a la vista predeterminada de la colección. Para obtener información sobre las vistas predeterminadas, consulte Uso de una vista predeterminada.
Si tiene un escenario avanzado y desea implementar su propia colección, considere el uso de la interfaz IList. Esta interfaz 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
A diferencia de .NET Framework, .NET se ejecuta con seguridad de plena confianza. Todos los enlaces de datos se ejecutan con el mismo acceso que el usuario que ejecuta la aplicación.
Vea también
.NET Desktop feedback