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同步綁定集合的一種方式
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.