2010-12-23 3 views
1

관찰 가능한 사진 개체 컬렉션을 표시하는 WPF 응용 프로그램의 목록 상자가 있습니다. 컬렉션에 사진을 추가하면 UI에 새로운 이미지가 바로 표시됩니다. CollectionChanged 이벤트를 사용하여 처리 할 수 ​​있음을 이해합니다. 핸들 컬렉션 변경 이벤트를 사용하는 방법에 대한 예제를 둘러 보았지만 효과가있는 것은 찾지 못했습니다. 누구든지 좋은 예를 알고 있습니까?Observable 컬렉션에서 컬렉션 변경 이벤트의 예

또 다른 것은 이미지가 내 컴퓨터의 디렉토리에서 나오고 파일 시스템 감시자가 새 사진을 추가하거나 삭제할 수있는 디렉토리를보고 있다는 것입니다. 현재 파일 시스템 이벤트 처리기를 사용하여 사진을 추가하거나 삭제할 때 컬렉션을 업데이트하지만 문제는 디렉토리에 새 사진을 추가 할 때 스레드가 아닌 컬렉션에서 컬렉션을 수정할 수 없다는 예외가 발생합니다. 주 스레드. 누구든지이 문제를 해결하는 방법을 알고 있습니까?

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)); 
    } 
} 

답변

3

첫 번째 질문 : ObservableCollection<T> 이미 INotifyCollectionChanged를 구현하므로 단순히 객체에 바인딩하고 UI가 자동으로 컬렉션에서 일어나는 업데이트를 얻을 것이다, 괜찮, 여기에이 문제에 대한 코드입니다.

두 번째 질문 :이 게시물을 참조하십시오 : WPF threading: can I update a control's data context in a non-UI thread? 및 accompening 의견.

+0

대단히 감사합니다! – MBU

0

Dispatcher.Invoke() 내부에 Add (새 사진 (e.FullPath))를 래핑하십시오. Add 메서드가 UI 스레드에서 호출됩니다.