Silverlight& ObservableCollection:在UI线程上提升CollectionChanged

时间:2010-10-06 02:27:42

标签: silverlight observablecollection

我需要在UI线程上引发ObservableCollection的CollectionChanged事件。

我见过不同的方法,从包装类到相关接口的自定义实现。

有没有简单的方法来覆盖ObservableCollection上的INotifyCollectionChanged来实现这个目的?

感谢。

2 个答案:

答案 0 :(得分:3)

您可以继承ObservableCollection并覆盖OnCollectionChanged和OnPropertyChanged方法,以使用相应的Dispatcher将事件编组回UI线程。

public class DispatcherObservableCollection<T> : ObservableCollection<T>
{
    Dispatcher _dispatcher;
    public DispatcherObservableCollection(Dispatcher dispatcher)
    {
        if (dispatcher == null)
            throw new ArgumentNullException("dispatcher");
        _dispatcher = dispatcher;
    }

    protected override void OnPropertyChanged(PropertyChangedEventArgs e)
    {
        if (!_dispatcher.CheckAccess())
        {
            _dispatcher.Invoke(
                new Action<PropertyChangedEventArgs>(base.OnPropertyChanged), e);
        }
        else
        {
            base.OnPropertyChanged(e);
        }
    }

    protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
    {
        if (!_dispatcher.CheckAccess())
        {
            _dispatcher.Invoke(
                new Action<NotifyCollectionChangedEventArgs>(base.OnCollectionChanged), e);
        }
        else
        {
            base.OnCollectionChanged(e);
        }
    }
}

答案 1 :(得分:0)

最简单的方法是确保在UI线程上添加/删除集合中的项目。这可以通过这样的简短函数来完成:

private void AddItemsToCollection(List<whatever> newItems)
{
    if (this.Dispatcher.CheckAccess()) 
    {
        newItems.ForEach(x => myObservableCollection.Add(x));
    }
    else 
        this.Dispatcher.BeginInvoke(new Action<List<whatever>>(AddItemsToCollection), newItems);
}