C# 可观察集合上集合更改事件的示例

C# 可观察集合上集合更改事件的示例,c#,wpf,observablecollection,inotifycollectionchanged,C#,Wpf,Observablecollection,Inotifycollectionchanged,我在WPF应用程序中有一个listbox,它显示一组可观察的照片对象。将照片添加到集合时,UI需要立即显示新图像。我知道这可以使用CollectionChanged事件来处理。我四处寻找了一些关于如何使用handle集合changed events的示例,但没有找到任何有效的方法。有人知道什么好例子吗 另一件事是,图像来自我计算机上的一个目录,我有一个文件系统监视程序监视目录中添加或删除的新照片。我目前正在使用文件系统事件处理程序在添加或删除照片时更新集合,但问题是,当我将新照片添加到目录时,会

我在WPF应用程序中有一个listbox,它显示一组可观察的照片对象。将照片添加到集合时,UI需要立即显示新图像。我知道这可以使用CollectionChanged事件来处理。我四处寻找了一些关于如何使用handle集合changed events的示例,但没有找到任何有效的方法。有人知道什么好例子吗

另一件事是,图像来自我计算机上的一个目录,我有一个文件系统监视程序监视目录中添加或删除的新照片。我目前正在使用文件系统事件处理程序在添加或删除照片时更新集合,但问题是,当我将新照片添加到目录时,会引发异常,说明我无法从非主线程的线程修改集合。有人知道如何解决这个问题吗?以下是此问题的代码:

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));
    }
}
公共类照片列表:ObservableCollection
{
DirectoryInfo\u目录;
私有文件系统监视程序\u监视程序;
公共照片列表()
{
_watcher=newfilesystemwatcher();
MessageBox.Show(“观看…”);
_watcher.Filter=“*.jpg”;
_watcher.Path=Environment.GetFolderPath(Environment.SpecialFolder.MyPictures);
_watcher.EnableRaisingEvents=true;
_watcher.Created+=新的FileSystemEventHandler(FileSystemWatcher_已创建);
_directory=newdirectoryinfo(Environment.GetFolderPath(Environment.SpecialFolder.MyPictures));
}
公共无效更新()
{
foreach(FileInfo f在_directory.GetFiles(“*.jpg”)中)
{
添加(新照片(f.全名));
}
}
公共字符串路径
{
设置
{
_directory=newdirectoryinfo(Environment.GetFolderPath(Environment.SpecialFolder.MyPictures));
更新();
}
得到
{
返回_directory.FullName;
}
}
已创建公用无效FileSystemWatcher_(对象发送方、FileSystemEventArgs e)
{
添加(新照片(如完整路径));
}
}

第一个问题:
ObservableCollection
已经实现了
INotifyCollectionChanged
,因此只需在该对象上绑定即可,UI将自动获取集合中发生的更新

第二个问题:请参阅本文:以及相应的注释。

将Add(新照片(e.FullPath))包装在Dispatcher.Invoke()中。这样,将在UI线程上调用Add