2008-12-13 11 views
7

Estoy luchando con la mejor manera de manejar una aplicación WPF que tenga actualizaciones dinámicas de datos. ¿Debo usar el rico enlace de datos proporcionado por WPF o no?¿Cuál es una buena manera de mostrar datos dinámicos en WPF?

Simplificaré el dominio de mi problema tanto como sea posible en el debate a continuación, y mencionaré brevemente algunas soluciones. Estoy muy interesado en los comentarios que esta comunidad pueda brindar.

simplificado Ámbito del problema: Supongamos que tiene un sistema con unos 1.000 artículos, cada uno con un único “ nombre”, y una dinámica “ velocidad” y “ ubicación”. Los datos de estos elementos se actualizan 60 veces por segundo. Desea mostrar esta información al usuario en una variedad de UI, desde "etiquetas que muestran números" hasta diales/medidores/indicadores/etc. gráficos. Trabajo perfecto para WPF: separe los elementos visuales del resto de la aplicación. ¿Cómo diseñarías este sistema?

Mi primera solución: Mi primera solución fue definir un objeto con velocidad y ubicación propiedades (dobles) llamado “DataItem”, definir una interfaz con un nombre propiedad (cadena). Los controles que muestran los datos tendrían que implementar la interfaz de nombre, se creó un "DataManager" que escaneó en busca de FrameworkElements que implementó la interfaz, elaboró ​​una lista con un nombre/pares FrameworkElements en el momento de la inicialización. Luego, 60 veces por segundo, se actualizó la lista de 1,000 DataItems y el DataContext de cada FrameworkElement coincidente se estableció en el objeto DataItem. Esto funcionó, el rendimiento fue aceptable (particularmente si los datos no siempre cambiaban).

Mi segunda solución solucionó el problema de que los controles de IU en la primera solución tenían que implementar alguna interfaz, yuk. Quiero usar controles WPF no modificados listos para usar (en algunos casos). Por lo tanto, la segunda solución es definir una “propiedad Attached” (lo pongo en el objeto DataManager), por lo que podría - en XAML - hacer cosas como

<Label DataManager.Name = "objectname" Content="{Binding}" /> 

De alguna manera, todavía no parece estar bien esta solución. Mi tercera solución fue estudiar la implementación de un DataSourceProvider personalizado. No tuve éxito No pude entender cómo era el modelo de proveedor de fuente de datos y cómo se usaría en este caso.

En este momento, estoy mirando el proyecto de visualización de datos dinámicos CodePlex publicado por Microsoft Research. Ese proyecto se trata de trazar/graficar datos dinámicos, pero podría haber algunas ideas allí. Así que aquí estoy en StackOverflow, normalmente un lugar con preguntas cortas y respuestas rápidas. :-)

Soy muy nuevo en WPF y agradecería cualquier pensamiento que alguien tenga sobre estos temas. Tenga en cuenta que el dominio del problema especificado aquí está simplificado, por lo que necesito una solución sólida. En realidad, hay muchos tipos diferentes de objetos de datos, cada uno con diferentes propiedades; y las actualizaciones de datos no son la misma tasa para cada objeto, y los controles de la UI muestran elementos individuales y grupos de elementos, los datos provienen de muchas fuentes, etc.

+0

Olvidé mencionar que la vinculación es en realidad bidireccional en algunos casos para algunos de los objetos (la IU puede controlarlos). – Bill

+0

Me temo que no tengo una respuesta, pero es una buena pregunta. Voy a vigilarlo. El diseño de WPF es algo con lo que todavía estoy luchando también. –

Respuesta

6

Ya casi está allí. Desea vincular los datos en dos niveles.

Primera - tienen su DataItem s aplicar INotifyPropertyChanged o hacer que se derivan de DispatchingObject y aplicar las propiedades de dependencia para cada uno de los valores que desee unirse a

En segundo lugar - mantener todos sus DataItem s en una de ObservableCollection<DataItem> o una DataTable. Necesita una colección que admita INotifyCollectionChanged o IBindingList.

Tercera - utilizar algún tipo de control de contenedores (cuadro de lista, control de la red tercera pary, etc) para obligar a la lista de DataItem s para su aplicación

Cuarto - Definir un DataTemplate para dar cada uno de los DataItem sa aspecto visual

Quinta - si es necesario, utilizar un DataTemplateSelector elegir dinámicamente el DataTemplate para diferentes tipos de DataItem s

Aquí hay un bit mínimo de xaml para comenzar

<ListBox ItemsSource="{Binding ...}" ItemTemplateSelector="{StaticResource DTSelector}"> 
+0

Scott, ¡Gracias por tomarse el tiempo! Nunca escuché sobre un selector de plantilla de artículo. Estoy en la etapa de investigación/creación de prototipos arquitectónicos, así que recorreré un poco la ruta sugerida. Estaba preocupado por 1000 elementos 60x por segundo que planteaban eventos de "propiedad modificada" como el mecanismo de notificación. Las pruebas indicarán – Bill

+0

Si implementa INotifyPropertyChanged PUEDE controlar cuándo notifica que una propiedad ha cambiado. – Will

+0

Deberá vigilar el rendimiento con seguridad. Si usa un panel de virtualización, WPF no volverá a dibujar los elementos que no son visibles. –

Cuestiones relacionadas