2010-02-18 6 views
1

Notre équipe de développement hors site a créé un modèle avec une propriété ObservableCollection. Maintenant, je suis en charge de créer le ViewModel, et j'ai des problèmes parce que le Modèle s'exécute dans un BackgroundWorker (un autre thread) - ce qui signifie que je ne peux pas mettre à jour la Vue en accrochant les événements CollectionChanged. Voici la solution que je l'ai fait:ObservableCollection dans Model + Threading dans ViewModel

private Model model = new Model(); 
public ObservableCollection<Entry> Entries { get; set; } 

public ctor() 
{ 
    BackgroundWorker peon = new BackgroundWorker(); 
    peon.DoWork += work; 
    peon.RunWorkerCompleted += updateViewCollection; 
    peon.RunWorkerAsync(); 
} 

private void work(object sender, DoWorkEventArgs e) 
{ 
    model.DoSomething(); 
} 

private void updateViewCollection(object sender, RunWorkerCompletedEventArgs e) 
{ 
    // model.entries is an ObservableCollection<Entry> 
    foreach (Entry en in this.model.entries) 
    { 
     if (!this.Entries.Contains(en)) 
      this.Entries.Add(en); 
    } 
} 

Y at-il une meilleure façon d'accrocher le ObservableCollection du modèle à la ObservableCollection de la vue par un filetage ViewModel?

Répondre

0

Je suppose que vous utilisez soit WPF ou silverlight. Vous accrochez les événements de la même manière que vous le feriez sur un seul thread, mais vous les ramenez sur l'objet Dispatcher (Invoke()). En supposant que votre collection observable est thread safe, vous ne devriez avoir aucun problème.

0

Jetez un oeil à ce http://nuget.org/List/Packages/Caliburn.Micro.INPC

Il a une vue base de modèle qui met en œuvre la propriété a changé qui maréchaux automatiquement au fil ui. il y a aussi une classe qui étend ObservableCollection qui fait la même chose appelée BindableCollection.