重新封裝ObservableCollection類,允許暫停通知事件
阿新 • • 發佈:2022-03-16
平常需要跟前臺介面繫結,並且需要動態插入刪除資料項的集合,我們經常會用到ObservableCollection類,這個類本身帶通知事件,集合有變化時,能實時通知介面更新。
但是,這個類本身沒有批量插入和刪除的方法,我們平常需要頻率進行一些插入和刪除時,介面就會頻率重新整理,會導致UI介面會卡。
這種使用場景其實比較多,於是自己把這個類繼承封裝了一下,允許暫停通知事件。
話不多說,直接上程式碼:
using System; using System.Collections.ObjectModel; using System.Collections.Specialized; namespaceCgdataBase { public class CgObservableCollection<T> : ObservableCollection<T>, ISuspendUpdate { private bool updatesEnabled = true; private bool collectionChanged = false; public void ResumeUpdate() { updatesEnabled = true;if (collectionChanged) { collectionChanged = false; OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset)); } } public void SuspendUpdate() { updatesEnabled = false; }protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e) { if (updatesEnabled) { base.OnCollectionChanged(e); } else { collectionChanged = true; } } } public interface ISuspendUpdate { void SuspendUpdate(); void ResumeUpdate(); } public class SuspendUpdateScope : IDisposable { private ISuspendUpdate _parent; public SuspendUpdateScope(ISuspendUpdate parent) { _parent = parent; parent.SuspendUpdate(); } public void Dispose() { _parent.ResumeUpdate(); } } }
具體程式碼的呼叫:
public CgObservableCollection<LogInfo> LogItems { get; set; } LogItems = new CgObservableCollection<LogInfo>(); LogItems.Insert(0, new LogInfo("狀態更新:" + state.ToString())); if (LogItems.Count > 30) { using (var scope = new SuspendUpdateScope(LogItems)) { while (LogItems.Count > 10) { LogItems.RemoveAt(LogItems.Count - 1); } } }
其它的使用和ObservableCollection一樣,需要用到批量的集合操作的時候,可以藉助SuspendUpdateScope類,實現批量操作後統一更新。