Observable Collection上的集合更改事件的示例

时间:2010-12-23 01:11:42

标签: c# wpf observablecollection inotifycollectionchanged

我在WPF应用程序中有列表框,显示可观察的照片对象集合。将照片添加到集合时,UI需要立即显示新图像。我知道这可以使用CollectionChanged事件来处理。我已经四处寻找有关如何使用句柄集合更改事件的示例,但我还没有找到任何有效的方法。有谁知道任何好的例子?

另一件事是图像来自我的计算机上的目录,我有一个文件系统观察者正在查看目录,以便添加或删除新照片。我正在使用文件系统事件处理程序在添加或删除照片时更新集合,但问题是当我向目录添加新照片时,会抛出一个异常,说我无法修改来自不是主线程。有谁知道如何解决这个问题?以下是此问题的代码:

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

2 个答案:

答案 0 :(得分:3)

第一个问题:ObservableCollection<T>已经实现了INotifyCollectionChanged,所以只需绑定该对象就可以了,UI会自动在集合中进行更新。

第二个问题:请参阅此帖子:WPF threading: can I update a control's data context in a non-UI thread?以及相关评论。

答案 1 :(得分:0)

将Dis(new Photo(e.FullPath))包装在Dispatcher.Invoke()中。这样就可以在UI线程上调用Add