Silverlight 和 ObservableCollection:在 UI 线程上提高 CollectionChanged

2024-01-02

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

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

是否有任何简单的方法可以覆盖 ObservableCollection 上的 INotifyCollectionChanged 来实现此目的?

Thanks.


您可以子类化 ObservableCollection 并重写 OnCollectionChanged 和 OnPropertyChanged 方法,以使用相应的调度程序将事件编组回 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);
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Silverlight 和 ObservableCollection:在 UI 线程上提高 CollectionChanged 的相关文章

随机推荐