Optimizar el rendimiento: Enlace de datos
Actualización: noviembre 2007
El enlace de datos de Windows Presentation Foundation (WPF) proporciona un método simple y coherente para que las aplicaciones presenten e interactúen con datos. Los elementos se pueden enlazar a los datos de diversos orígenes de datos en forma de objetos CLR y XML.
En este tema se proporcionan recomendaciones sobre el rendimiento del enlace de datos.
Este tema contiene las secciones siguientes.
- Cómo se resuelven las referencias de enlace de datos
- Enlazar a objetos CLR grandes
- Enlazar a una propiedad ItemsSource
- Enlazar IList a ItemsControl no IEnumerable
- No convierta objetos CLR en XML solamente para el enlace de datos.
- Temas relacionados
Cómo se resuelven las referencias de enlace de datos
Antes de explicar los problemas de rendimiento de enlace de datos, vale la pena explorar cómo el motor de enlace de datos de Windows Presentation Foundation (WPF) resuelve las referencias de objeto para el enlace.
El origen de un enlace de datos de Windows Presentation Foundation (WPF) puede ser cualquier objeto CLR. Es posible enlazar a propiedades, subpropiedades o indizadores de un objeto CLR. Las referencias de enlace se resuelven utilizando reflexión Microsoft .NET Framework o una interfaz ICustomTypeDescriptor. Estos son tres métodos para resolver referencias de objeto para el enlace.
El primer método implica el uso de la reflexión. En este caso, el objeto PropertyInfo se utiliza para detectar los atributos de la propiedad y proporcionar acceso a los metadatos de propiedad. Cuando se utiliza la interfaz ICustomTypeDescriptor, el motor de enlace de datos utiliza esta interfaz para tener acceso a los valores de propiedad. La interfaz ICustomTypeDescriptor es especialmente útil en aquellos casos en los que el objeto no tiene un conjunto estático de propiedades.
Las notificaciones de cambios de propiedad se pueden proporcionar implementando la interfaz INotifyPropertyChanged o utilizando las notificaciones de cambios asociadas al objeto TypeDescriptor. Sin embargo, la estrategia preferida para implementar notificaciones de cambios de propiedades es utilizar INotifyPropertyChanged.
Si el objeto de origen es un objeto CLR y la propiedad de origen es una propiedad CLR, el motor de enlace de datos de Windows Presentation Foundation (WPF) tiene que utilizar primero la reflexión en el objeto de origen para obtener el objeto TypeDescriptory, a continuación, consultar un objeto PropertyDescriptor. Esta secuencia de operaciones de reflexión puede necesitar mucho tiempo, desde la perspectiva del rendimiento.
El segundo método para resolver referencias a objetos implica un objeto de origen CLR que implementa la interfaz INotifyPropertyChanged y una propiedad de origen que es una propiedad CLR. En este caso, el motor de enlace de datos utiliza directamente la reflexión en el tipo de origen y obtiene la propiedad necesaria. Este método continúa sin ser el óptimo, pero sus requisitos de espacio de trabajo son menores que los del primer método.
El tercer método para resolver referencias de objeto implica un objeto de origen que es un objeto DependencyObject y una propiedad que es un objeto DependencyProperty. En este caso, el motor de enlace de datos no necesita utilizar la reflexión. En su lugar, el motor de propiedad y el motor de enlace de datos resuelven juntos la referencia de propiedad de manera independiente. Éste es el método óptimo para resolver referencias de objeto utilizadas para el enlace de datos.
La tabla siguiente compara la velocidad de enlace de datos de la propiedad Text de mil elementos TextBlock utilizando estos tres métodos.
Enlazar la propiedad Text de un TextBlock |
Tiempo de enlace (ms) |
Tiempo de representación, incluido el enlace (ms) |
---|---|---|
A una propiedad de un objeto CLR |
115 |
314 |
A una propiedad de un objeto CLR que implementa INotifyPropertyChanged |
115 |
305 |
A un objeto DependencyProperty de un objeto DependencyObject. |
90 |
263 |
Enlazar a objetos CLR grandes
Hay un impacto significativo sobre el rendimiento cuando se realiza el enlace de datos a un objeto CLR único con miles de propiedades. Puede minimizar este impacto dividiendo el objeto único en varios objetos CLR con menos propiedades. La tabla muestra los tiempos de enlace y representación para el enlace de datos a un objeto CLR grande único frente a varios objetos menores.
Enlace de datos de 1000 objetos TextBlock |
Tiempo de enlace (ms) |
Tiempo de representación, incluido el enlace (ms) |
---|---|---|
A un objeto CLR con 1000 propiedades |
950 |
1200 |
A 1000 objetos CLR con una propiedad |
115 |
314 |
Enlazar a una propiedad ItemsSource
Considere un escenario en el que tenga un objeto CLRList<T> que contiene una lista de empleados que desea mostrar en un control ListBox. Para crear una correspondencia entre estos dos objetos, enlazaría la lista de empleados a la propiedad ItemsSource del control ListBox. No obstante, suponga que tiene un nuevo empleado que se incorpora al grupo. Podría pensar que, para insertar esta nueva persona en los valores ListBox enlazados, agregaría simplemente esta persona a la lista de empleados y esperaría que el cambio fuera reconocido automáticamente por el motor de enlace de datos. Esa suposición se demostraría falsa; en realidad, el cambio no se reflejaría automáticamente en ListBox. Esto se debe a que el objeto CLRList<T> no produce automáticamente un evento de cambio de colección. Para que el control ListBox captara los cambios, tendría que volver a crear la lista de empleados y asociarla de nuevo a la propiedad ItemsSource del control ListBox. Aunque esta solución funciona, introduce un impacto enorme sobre el rendimiento. Cada vez que se reasigna la propiedad ItemsSource del control ListBox a un nuevo objeto, el control ListBox desecha primero sus elementos anteriores y regenera la lista completa. El impacto sobre el rendimiento se magnifica si el control ListBox se asigna a un objeto DataTemplate complejo.
Una solución muy eficaz a este problema es convertir la lista de empleados en una colección ObservableCollection<T>. Un objeto ObservableCollection<T> provoca una notificación de cambios que el motor de enlace de datos puede recibir. El evento agrega o quita un elemento de un control ItemsControl sin necesidad de regenerar la lista completa.
La tabla siguiente muestra el tiempo necesario para actualizar el control ListBox (con virtualización de la interfaz de usuario desactivada) cuando se agrega un elemento. El número de la primera fila representa el tiempo transcurrido cuando el objeto CLRList<T> se enlaza a la propiedad ItemsSource de un elemento ListBox. El número en la segunda fila representa el tiempo transcurrido cuando una colección ObservableCollection<T> se enlaza a la propiedad ItemsSource de un elemento ListBox. Observe los significativos ahorros de tiempo mediante la estrategia de enlace de datos de ObservableCollection<T>.
Enlace de datos de ItemsSource |
Tiempo de actualización para 1 elemento (ms) |
---|---|
A un objeto CLRList<T> |
1656 |
A una colección ObservableCollection<T> |
20 |
Enlazar IList a ItemsControl no IEnumerable
Si puede elegir entre enlazar un objeto IList<T> o una interfaz IEnumerable a un objeto ItemsControl, elija el objeto IList<T>. Enlazar la interfaz IEnumerable a un control ItemsControl obliga a WPF a crear un objeto IList<T> contenedor, lo que significa que el rendimiento se ve afectado por la sobrecarga innecesaria de un segundo objeto.
No convierta objetos CLR en XML solamente para el enlace de datos.
WPF permite enlazar datos a contenido XML; no obstante, en enlace de datos a contenido XML es más lento que el enlace de datos a objetos CLR. No convierta datos de objetos CLR en XML si su único propósito es el enlace de datos.
Vea también
Conceptos
Optimizar WPF: Rendimiento de aplicaciones
Planear para mejorar el rendimiento de aplicaciones
Optimizar el rendimiento: Aprovechar el hardware
Optimizar el rendimiento: Presentación y diseño
Optimizar el rendimiento: Imágenes y gráficos 2D
Optimizar el rendimiento: Comportamiento de objetos
Optimizar el rendimiento: Recursos de aplicación
Optimizar el rendimiento: Texto
Optimizar el rendimiento: Otras recomendaciones