MVVM模式下,想要在ViewModel下去更新一个绑定在UI的集合,如果在线程中去更新这个集合,可以使用Application.Current.Dispatcher.Invoke。也可以使用一下这种方式。 我使用SynchronizationContext 来进行同步,代码如下,每次更新这个集合都会同步到UI线程中去执行,看起来很nice。 SynchronizationContext 简单来讲是允许一个线程和另外一个线程进行通讯,SynchronizationContext在通讯中充当传输者的角色。另外这里有个地方需要清楚的,不是每个线程都附加SynchronizationContext这个对象,只有UI线程是一直拥有的。 public class AsyncObservableCollection<T> : ObservableCollection<T> { private SynchronizationContext _synchronizationContext = SynchronizationContext.Current; public AsyncObservableCollection() { } public AsyncObservableCollection(IEnumerable<T> list) : base(list) { } protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e) { if (SynchronizationContext.Current == _synchronizationContext) { RaiseCollectionChanged(e); } else { _synchronizationContext.Post(RaiseCollectionChanged, e); } } private void RaiseCollectionChanged(object param) { base.OnCollectionChanged((NotifyCollectionChangedEventArgs)param); } protected override void OnPropertyChanged(PropertyChangedEventArgs e) { if (SynchronizationContext.Current == _synchronizationContext) { RaisePropertyChanged(e); } else { _synchronizationContext.Post(RaisePropertyChanged, e); } } private void RaisePropertyChanged(object param) { base.OnPropertyChanged((PropertyChangedEventArgs)param); }
#region Range update public void AddRange(IList collection) { if (collection == null) return; foreach (T item in collection) { Items.Add(item); } OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset)); } public void InsertRanage(int indexat,IList collection) { if (collection == null || indexat<0) { return; } int at = indexat; foreach (T item in collection) { Items.Insert(at, item); at++; } OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset)); } public void RemoveRange(IList collection) { if (collection == null) return; foreach (T item in collection) { if(Items.Contains(item)) Items.Remove(item); } OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset)); } public void Replace(T item) { ReplaceRange(new[] { item }); } public void ReplaceRange(IList collection) { Items.Clear(); if (collection != null) { foreach (T item in collection) { Items.Add(item); } } OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset)); } #endregion
}
MVVM模式下,线程与UI同步绑定集合的一种方式
最新推荐文章于 2024-04-14 17:06:49 发布