2010-12-23 3 views
1

J'ai une liste déroulante dans une application WPF qui affiche une collection observable d'objets photo. Lorsqu'une photo est ajoutée à la collection, l'interface utilisateur doit afficher la nouvelle image immédiatement. Je comprends que cela peut être géré en utilisant l'événement CollectionChanged. J'ai cherché des exemples sur la façon d'utiliser la collection de poignées, mais je n'ai rien trouvé qui fonctionne. Est-ce que quelqu'un connaît de bons exemples?Exemples d'événements de collection modifiés sur Observable Collection

Une autre chose est que les images proviennent d'un répertoire sur mon ordinateur et j'ai un observateur de système de fichiers en regardant le répertoire pour les nouvelles photos ajoutées ou supprimées. J'utilise actuellement le gestionnaire d'événements de système de fichiers pour mettre à jour les collections lorsqu'une photo est ajoutée ou supprimée mais le problème est quand j'ajoute une nouvelle photo dans le répertoire, une exception est jetée disant que je ne peux pas modifier la collection. fil principal. Est-ce que quelqu'un sait comment résoudre ce problème aussi? Voici le code pour ce problème:

public class PhotoList : ObservableCollection<Photo> 
{ 
    DirectoryInfo _directory; 
    private FileSystemWatcher _watcher; 

    public PhotoList() 
    { 
     _watcher = new FileSystemWatcher(); 
     MessageBox.Show("Watching.."); 
     _watcher.Filter = "*.jpg"; 
     _watcher.Path = Environment.GetFolderPath(Environment.SpecialFolder.MyPictures); 
     _watcher.EnableRaisingEvents = true; 

     _watcher.Created += new FileSystemEventHandler(FileSystemWatcher_Created); 

     _directory = new DirectoryInfo(Environment.GetFolderPath(Environment.SpecialFolder.MyPictures)); 
    } 

    public void Update() 
    { 
     foreach(FileInfo f in _directory.GetFiles("*.jpg")) 
     { 
      Add(new Photo(f.FullName)); 
     } 
    } 


    public string Path 
    { 
     set 
     { 
      _directory = new DirectoryInfo(Environment.GetFolderPath(Environment.SpecialFolder.MyPictures)); 
      Update(); 
     } 
     get 
     { 
      return _directory.FullName; 
     } 
    } 

    public void FileSystemWatcher_Created(object sender, FileSystemEventArgs e) 
    { 
     Add(new Photo(e.FullPath)); 
    } 
} 

Répondre

3

Première question: ObservableCollection<T> implémente déjà INotifyCollectionChanged, donc simplement lier sur cet objet et vous êtes bien, l'interface utilisateur va obtenir les mises à jour qui se passe dans la collection automatiquement.

Deuxième question: Voir ce post: WPF threading: can I update a control's data context in a non-UI thread? et les commentaires d'accompagnement.

+0

Merci beaucoup! – MBU

0

envelopper l'ajout (nouvelle photo (e.FullPath)) à l'intérieur de Dispatcher.Invoke(). De cette façon, ajouter sera appelé sur le fil de l'interface utilisateur

Questions connexes