2010-06-23 4 views
3

C'est un gros problème pour moi. Je veux écrire une application WPF/MVVM qui récupère des données d'un service WCF en ligne.MVVM: Que faire si le modèle est constamment changé par un thread d'arrière-plan?

Le problème est, que le processus de récupération doit être toutes les disons, par exemple, 15 secondes (c'est une application critique dans le temps).

IEnumerable est toujours impliqué, chaque fois que je vérifie le service WCF, j'obtiens des valeurs différentes, car il y a aussi des données de temps impliquées.

Comment pourrais-je m'y prendre? Effacer le ObservableCollection dans le ViewModel ne peut pas être correct, ou est-ce?

+0

Le nombre d'éléments change-t-il ou seulement les données des éléments? –

+0

Les deux, toutes les données fluctuent constamment, en fonction des événements du monde réel. – StormianRootSolver

Répondre

5

Suspension et reprise des mises à jour de changement sur votre ObservableCollection pourrait être une approche:

Voir la réponse: ItemsControl.ItemsSource MVVM performance

De cette façon, vous pouvez suspendre tout vous désactivez votre collection et le mettre à jour, puis reprendre lorsque vous » re fait. Cette approche devrait atténuer le problème de mangling la collection et générer beaucoup d'événements de mise à jour de changement.

+0

Merci beaucoup. Je vais mettre en œuvre cette classe instantanément, c'est incroyable. :-) – StormianRootSolver

1

Je pense que cela devrait aller bien tant qu'il n'implique pas de grands changements (comme des milliers d'éléments) et que vous gérez la sécurité des threads.

Pour prendre en charge l'actualisation automatique lorsque le nombre d'éléments change dans la collection, utilisez ObservableCollection et pour prendre en charge l'actualisation automatique des propriétés de l'objet implémentées INotifyPropertyChanged. En cas de grande collection d'éléments, au lieu de vider la collection et de la remplir de nouvelles données, vous pouvez optimiser ce processus en trouvant les changements entre l'ancien et le nouvel ensemble d'éléments et mettre à jour la collection en conséquence. Pour gérer la sécurité des threads, vous devez placer tout code directement ou indirectement (cela inclut les modifications apportées aux propriétés ViewModel qui mettent à jour la vue). Modifiez la vue dans la méthode Dispatcher.Invoke.

+0

J'avais peur que c'était la réponse ... en fait j'espérais une méthode qui arrête l'actualisation de l'écran pendant que je fais mes mises à jour. De toute façon, merci pour votre aide! :-) – StormianRootSolver

Questions connexes