Información general sobre orígenes de enlacesBinding Sources Overview

En el enlace de datos, el objeto de origen de enlace hace referencia al objeto de que se obtienen los datos.In data binding, the binding source object refers to the object you obtain data from. En este tema se describen los tipos de objetos que se pueden usar como origen de enlace.This topic discusses the types of objects you can use as the binding source.

Tipos de orígenes de enlaceBinding Source Types

El enlace de datos Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) admite los siguientes tipos de orígenes de enlace:Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) data binding supports the following binding source types:

Origen de enlaceBinding Source DescripciónDescription
objetos Common Language Runtime (CLR)common language runtime (CLR) objects Puede enlazar a propiedades públicas, subpropiedades, así como indizadores, de cualquier objeto Common Language Runtime (CLR).You can bind to public properties, sub-properties, as well as indexers, of any common language runtime (CLR) object. El motor de enlace utiliza la reflexión de CLR para obtener los valores de las propiedades.The binding engine uses CLR reflection to get the values of the properties. Como alternativa, los objetos que implementan ICustomTypeDescriptor o tienen un TypeDescriptionProvider registrado también funcionan con el motor de enlace.Alternatively, objects that implement ICustomTypeDescriptor or have a registered TypeDescriptionProvider also work with the binding engine.

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.For more information about how to implement a class that can serve as a binding source, see Implementing a Class for the Binding Source later in this topic.
objetos dinámicosdynamic objects Puede enlazar a las propiedades y los indizadores disponibles de un objeto que implementa la interfaz IDynamicMetaObjectProvider.You can bind to available properties and indexers of an object that implements the IDynamicMetaObjectProvider interface. Si se puede acceder al miembro en código, puede enlazar a él.If you can access the member in code, you can bind to it. Por ejemplo, si un objeto dinámico permite acceder a un miembro en código mediante someObjet.AProperty, puede enlazar a él estableciendo el trazado de enlace en AProperty.For example, if a dynamic object enables you to access a member in code via someObjet.AProperty, you can bind to it by setting the binding path to AProperty.
Objetos ADO.NETADO.NET objects Puede enlazar a objetos ADO.NET, como DataTable.You can bind to ADO.NET objects, such as DataTable. El DataView ADO.NET implementa la interfaz IBindingList, que proporciona notificaciones de cambios que el motor de enlace escucha.The ADO.NET DataView implements the IBindingList interface, which provides change notifications that the binding engine listens for.
Objetos XMLXML objects Puede enlazar y ejecutar consultas de XPath en un XmlNode, XmlDocumento XmlElement.You can bind to and run XPath queries on an XmlNode, XmlDocument, or XmlElement. Una manera cómoda de acceder a los datos XML que es el origen de enlace en el marcado es usar un objeto de XmlDataProvider.A convenient way to access XML data that is the binding source in markup is to use an XmlDataProvider object. Para más información, consulte Cómo: Enlazar a datos XML mediante XMLDataProvider y consultas XPath.For more information, see Bind to XML Data Using an XMLDataProvider and XPath Queries.

También puede enlazar a un XElement o XDocument, o enlazar a los resultados de las consultas que se ejecutan en objetos de estos tipos mediante LINQ to XML.You can also bind to an XElement or XDocument, or bind to the results of queries run on objects of these types by using LINQ to XML. Una manera cómoda de utilizar LINQ to XML para tener acceso a los datos XML que es el origen de enlace en el marcado es usar un objeto ObjectDataProvider.A convenient way to use LINQ to XML to access XML data that is the binding source in markup is to use an ObjectDataProvider object. Para más información, consulte Cómo: Enlazar a los resultados de una consulta LINQ for XML, XDocument o XElement.For more information, see Bind to XDocument, XElement, or LINQ for XML Query Results.
Objetos DependencyObject.DependencyObject objects Puede enlazar a las propiedades de dependencia de cualquier DependencyObject.You can bind to dependency properties of any DependencyObject. Para ver un ejemplo, consulte Cómo: Enlazar las propiedades de dos controles.For an example, see Bind the Properties of Two Controls.

Implementar una clase para el origen de enlaceImplementing a Class for the Binding Source

Puede crear sus propios orígenes de enlace.You can create your own binding sources. En esta sección se explica lo que necesita saber si está implementando una clase para que actúe como un origen de enlace.This section discusses the things you need to know if you are implementing a class to serve as a binding source.

Proporcionar notificaciones de cambiosProviding Change Notifications

Si usa OneWay o TwoWay enlace (porque desea que el IUUI se actualice cuando las propiedades de origen de enlace cambian dinámicamente), debe implementar un mecanismo de notificación de cambio de propiedad adecuado.If you are using either OneWay or TwoWay binding (because you want your IUUI to update when the binding source properties change dynamically), you must implement a suitable property changed notification mechanism. El mecanismo recomendado es que el CLR o la clase dinámica implementen la interfaz INotifyPropertyChanged.The recommended mechanism is for the CLR or dynamic class to implement the INotifyPropertyChanged interface. Para más información, consulte Cómo: Implementar la notificación de cambio de propiedad.For more information, see Implement Property Change Notification.

Si crea un objeto CLR que no implementa INotifyPropertyChanged, debe organizar su propio sistema de notificación para asegurarse de que los datos usados en un enlace permanecen actualizados.If you create a CLR object that does not implement INotifyPropertyChanged, then you must arrange for your own notification system to make sure that the data used in a binding stays current. Puede proporcionar notificaciones de cambio admitiendo el patrón PropertyChanged para cada propiedad para la que desee cambiar las notificaciones.You can provide change notifications by supporting the PropertyChanged pattern for each property that you want change notifications for. Para admitir este patrón, defina un evento PropertyName cambiado para cada propiedad, donde PropertyName es el nombre de la propiedad.To support this pattern, you define a PropertyNameChanged event for each property, where PropertyName is the name of the property. Se genera el evento cada vez que cambia la propiedad.You raise the event every time the property changes.

Si el origen de enlace implementa uno de estos mecanismos de notificación, se producen automáticamente las actualizaciones de destino.If your binding source implements one of these notification mechanisms, target updates happen automatically. Si por alguna razón el origen de enlace no proporciona las notificaciones de cambio de propiedad apropiadas, tiene la opción de usar el método UpdateTarget para actualizar la propiedad de destino explícitamente.If for any reason your binding source does not provide the proper property changed notifications, you have the option to use the UpdateTarget method to update the target property explicitly.

Otras característicasOther Characteristics

En la lista siguiente se proporcionan otros puntos importantes a tener en cuenta:The following list provides other important points to note:

  • Si desea crear el objeto en XAMLXAML, la clase debe tener un constructor sin parámetros.If you want to create the object in XAMLXAML, the class must have a parameterless constructor. En algunos lenguajes .NET, como C#, el constructor sin parámetros podría crearse automáticamente.In some .NET languages, such as C#, the parameterless constructor might be created for you.

  • Las propiedades que se utilizan como propiedades de origen de enlace para un enlace deben ser propiedades públicas de la clase.The properties you use as binding source properties for a binding must be public properties of your class. 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.Explicitly defined interface properties cannot be accessed for binding purposes, nor can protected, private, internal, or virtual properties that have no base implementation.

  • No se puede enlazar a campos públicos.You cannot bind to public fields.

  • El tipo de la propiedad declarada en la clase es el tipo que se pasa al enlace.The type of the property declared in your class is the type that is passed to the binding. 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.However, the type ultimately used by the binding depends on the type of the binding target property, not of the binding source property. Si hay una diferencia en el tipo, puede escribir un convertidor para controlar cómo la propiedad personalizada se pasa inicialmente al enlace.If there is a difference in type, you might want to write a converter to handle how your custom property is initially passed to the binding. Para obtener más información, vea IValueConverter.For more information, see IValueConverter.

Utilizar objetos completos como origen de enlaceUsing Entire Objects as a Binding Source

Puede utilizar objetos completos como origen de enlace.You can use an entire object as a binding source. Puede especificar un origen de enlace mediante el Source o la propiedad DataContext y, a continuación, proporcionar una declaración de enlace en blanco: {Binding}.You can specify a binding source by using the Source or the DataContext property, and then provide a blank binding declaration: {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.Scenarios in which this is useful include binding to objects that are of type string, binding to objects with multiple properties you are interested in, or binding to collection objects. 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.For an example of binding to an entire collection object, see Use the Master-Detail Pattern with Hierarchical Data.

Observe que puede ser necesario aplicar lógica personalizada para que los datos sean significativos para la propiedad de destino enlazada.Note that you may need to apply custom logic so that the data is meaningful to your bound target property. La lógica personalizada puede tener el formato de un convertidor personalizado (si no existe la conversión de tipos predeterminada) o una DataTemplate.The custom logic may be in the form of a custom converter (if default type conversion does not exist) or a 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.For more information about converters, see the Data Conversion section of Data Binding Overview. Para más información sobre las plantillas de datos, consulte Información general sobre plantillas de datos.For more information about data templates, see Data Templating Overview.

Utilizar objetos de colección como origen de enlaceUsing Collection Objects as a Binding Source

A menudo, el objeto que desea utilizar como origen de enlace es una colección de objetos personalizados.Often, the object you want to use as the binding source is a collection of custom objects. Cada objeto actúa como el origen para una instancia de un enlace repetido.Each object serves as the source for one instance of a repeated binding. 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.For example, you might have a CustomerOrders collection that consists of CustomerOrder objects, where your application iterates over the collection to determine how many orders exist and the data contained in each.

Puede enumerar en cualquier colección que implementa la interfaz IEnumerable.You can enumerate over any collection that implements the IEnumerable interface. Sin embargo, para configurar enlaces dinámicos de modo que las inserciones o eliminaciones de la colección actualicen el IUUI automáticamente, la colección debe implementar la interfaz INotifyCollectionChanged.However, to set up dynamic bindings so that insertions or deletions in the collection update the IUUI automatically, the collection must implement the INotifyCollectionChanged interface. Esta interfaz expone un evento que debe provocarse siempre que se realicen cambios en la colección subyacente.This interface exposes an event that must be raised whenever the underlying collection changes.

La clase ObservableCollection<T> es una implementación integrada de una colección de datos que expone la interfaz INotifyCollectionChanged.The ObservableCollection<T> class is a built-in implementation of a data collection that exposes the INotifyCollectionChanged interface. Los objetos de datos individuales dentro de la colección deben cumplir los requisitos descritos en las secciones anteriores.The individual data objects within the collection must satisfy the requirements described in the preceding sections. Para ver un ejemplo, consulte Cómo: Crear y enlazar a una colección ObservableCollection.For an example, see Create and Bind to an 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.Before implementing your own collection, consider using ObservableCollection<T> or one of the existing collection classes, such as List<T>, Collection<T>, and BindingList<T>, among many others.

WPF nunca se enlaza directamente a una colección.WPF never binds directly to a collection. Si especifica una colección como origen de enlace, WPF se enlaza en realidad a la vista predeterminada de la colección.If you specify a collection as a binding source, WPF actually binds to the collection's default view. Para más información sobre las vistas predeterminadas, consulte Información general sobre el enlace de datos.For information about default views, see Data Binding Overview.

Si tiene un escenario avanzado y desea implementar su propia colección, considere la posibilidad de usar la interfaz IList.If you have an advanced scenario and you want to implement your own collection, consider using the IList interface. IList proporciona una colección no genérica de objetos a los que se puede tener acceso individualmente por índice, lo que puede mejorar el rendimiento.IList provides a non-generic collection of objects that can be individually accessed by index, which can improve performance.

Requisitos de permisos en el enlace de datosPermission Requirements in Data Binding

Cuando se enlazan los datos, debe tener en cuenta el nivel de confianza de la aplicación.When data binding, you must consider the trust level of the application. 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:The following table summarizes what property types can be bound to in an application that is executing in either full trust or partial trust:

Tipo de propiedadProperty type

(todos los modificadores de acceso)(all access modifiers)
Propiedad de objeto dinámicoDynamic object property Propiedad de objeto dinámicoDynamic object property Propiedad CLRCLR property Propiedad CLRCLR property Propiedad de dependenciaDependency property Propiedad de dependenciaDependency property
Nivel de confianzaTrust level Plena confianzaFull trust Confianza parcialPartial trust Plena confianzaFull trust Confianza parcialPartial trust Plena confianzaFull trust Confianza parcialPartial trust
Clase públicaPublic class Yes Yes Yes Yes Yes Yes
Clase no públicaNon-public class Yes NoNo Yes NoNo Yes Yes

En esta tabla se describen los siguientes puntos importantes acerca de los requisitos de permisos en el enlace de datos:This table describes the following important points about permission requirements in data binding:

  • En el caso de las propiedades CLR, el enlace de datos funciona siempre que el motor de enlace pueda acceder a la propiedad de origen de enlace mediante la reflexión.For CLR properties, data binding works as long as the binding engine is able to access the binding source property using reflection. 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.Otherwise, the binding engine issues a warning that the property cannot be found and uses the fallback value or the default value, if it is available.

  • Puede enlazar a propiedades en objetos dinámicos que se definen en tiempo de compilación o tiempo de ejecución.You can bind to properties on dynamic objects that are defined at compile time or run time.

  • Siempre puede enlazar a propiedades de dependencia.You can always bind to dependency properties.

El requisito de permiso para el enlace XML es similar.The permission requirement for XML binding is similar. En un espacio aislado de confianza parcial, XmlDataProvider produce un error cuando no tiene permisos de acceso a los datos especificados.In a partial-trust sandbox, XmlDataProvider fails when it does not have permissions to access the specified data.

Los objetos con un tipo anónimo son internos.Objects with an anonymous type are internal. Puede enlazar a propiedades de tipos anónimos solo cuando se ejecutan en plena confianza.You can bind to properties of anonymous types only when running in full trust. 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).For more information about anonymous types, see Anonymous Types (C# Programming Guide) or Anonymous Types (Visual Basic) (Visual Basic).

Para más información sobre la seguridad de confianza parcial, consulte Seguridad de confianza parcial de WPF.For more information about partial-trust security, see WPF Partial Trust Security.

Vea tambiénSee also