2008-12-13 5 views
7

Je suis aux prises avec la meilleure façon de gérer une application WPF qui a des mises à jour de données dynamiques. Dois-je utiliser la liaison de données riche fournie par WPF ou non? Je vais simplifier autant que possible mon domaine de problème dans la discussion ci-dessous, et mentionner brièvement quelques solutions. Je suis très intéressé par tous les commentaires que cette communauté peut fournir.Quel est un bon moyen d'afficher des données dynamiques dans WPF?

simplifié Problème de domaine: Supposons que vous ayez un système avec environ 1 000 articles, chacun avec un unique « nom », et une dynamique « vitesse » et « emplacement ». Les données pour ces éléments sont mises à jour 60 fois par seconde. Vous souhaitez afficher ces données à l'utilisateur dans une variété d'interfaces utilisateur - tout, des «étiquettes affichant des chiffres» aux cadrans graphiques/compteurs/jauges/etc. Un travail parfait pour WPF - séparez les visuels du reste de l'application. Comment concevez-vous ce système?

Ma première solution: Ma première solution a été de définir un objet avec des propriétés de vitesse et l'emplacement (doubles) appelé « DataItem », définir une interface avec un nom propriété (string). Les contrôles qui affichent les données devraient implémenter l'interface de nom, un "DataManager" a été créé qui a analysé les FrameworkElements qui ont implémenté l'interface, construit une liste de paires nom/FrameworkElements au moment de l'initialisation. Puis, 60 fois par seconde, la liste de 1 000 DataItems a été mise à jour et le DataContext de chaque FrameworkElement correspondant a été défini sur l'objet DataItem. Cela a fonctionné, la performance était acceptable (en particulier si les données ne changeaient pas toujours). Ma deuxième solution a résolu le problème que les contrôles d'interface utilisateur de la première solution devaient tous implémenter interface-yuk. Je veux utiliser des contrôles WPF prêts à l'emploi non modifiés (dans certains cas). Ainsi, la deuxième solution consistait à définir une « propriété Attached » (je l'ai mis sur l'objet DataManager), vous pouvez donc - en XAML - faire des choses comme

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

D'une certaine façon, cette solution ne semble pas encore droit. Ma troisième solution était de se pencher sur l'implémentation d'un DataSourceProvider personnalisé. Je n'ai pas réussi. Je ne pouvais pas comprendre le modèle de fournisseur de source de données et comment il serait utilisé dans ce cas. À l'heure actuelle, je me penche sur le projet «Dynamic Data Display» de CodePlex publié par Microsoft Research. Ce projet consiste à tracer/représenter graphiquement des données dynamiques, mais il pourrait y avoir quelques idées là-bas. Donc, je suis sur StackOverflow - normalement un endroit avec des questions courtes et des réponses rapides. :-)

Je suis très nouveau à WPF et j'apprécierais toutes les pensées que quelqu'un a sur ces questions. S'il vous plaît gardez à l'esprit que le domaine de problème spécifié ici est simplifié, j'ai donc besoin d'une solution robuste. Il existe en réalité de nombreux types d'objets de données, chacun avec des propriétés différentes; et les mises à jour de données ne sont pas le même taux pour chaque objet, et les contrôles d'interface utilisateur affichent des éléments uniques et des groupes d'éléments, les données proviennent de nombreuses sources, etc

+0

J'ai oublié de mentionner que la liaison est réellement bidirectionnelle dans certains cas pour certains des objets (l'interface utilisateur peut les contrôler). – Bill

+0

J'ai bien peur de ne pas avoir de réponse, mais c'est une bonne question. Je vais garder mes yeux dessus. La conception de WPF est quelque chose que je suis toujours aux prises avec. –

Répondre

6

Vous êtes presque là. Vous voulez lier les données à deux niveaux.

First - ont votre DataItem s mettre en œuvre INotifyPropertyChanged ou faire dérivent de DispatchingObject et mettre en œuvre des propriétés de dépendance pour chacune des valeurs que vous souhaitez lier à

Deuxièmement - garder tous vos DataItem s dans un de ObservableCollection<DataItem> ou un DataTable. Vous avez besoin d'une collection qui prend en charge INotifyCollectionChanged ou IBindingList.

Troisièmement - utiliser une sorte de contrôle des conteneurs (listbox, contrôle de la grille 3e Pary, etc.) pour lier la liste des DataItem s à votre application

Quatrième - Définir un DataTemplate pour donner chacun des DataItem aspect visuel de

cinquième - si nécessaire, utilisez un DataTemplateSelector choisir dynamiquement le DataTemplate pour différents types de DataItem s

Voici un petit peu de xaml pour commencer

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

Scott, Merci d'avoir pris le temps! Je n'ai jamais entendu parler d'un sélecteur de modèle d'élément. Je suis à l'étape de la recherche/prototypage architecturale, donc je vais suivre un peu le chemin suggéré. Je me suis inquiété de 1000 articles 60x par seconde soulevant des événements "propriété changée" comme mécanisme de notification. Les tests indiqueront – Bill

+0

Si vous implémentez INotifyPropertyChanged, vous pouvez contrôler lorsque vous notifiez qu'une propriété a été modifiée. – Will

+0

Vous aurez besoin de garder un œil sur la performance à coup sûr. Si vous utilisez un panneau de virtualisation, WPF ne redessine pas les éléments qui ne sont pas visibles. –

Questions connexes