1. 程式人生 > 其它 >重新封裝ObservableCollection類,允許暫停通知事件

重新封裝ObservableCollection類,允許暫停通知事件

平常需要跟前臺介面繫結,並且需要動態插入刪除資料項的集合,我們經常會用到ObservableCollection類,這個類本身帶通知事件,集合有變化時,能實時通知介面更新。

但是,這個類本身沒有批量插入和刪除的方法,我們平常需要頻率進行一些插入和刪除時,介面就會頻率重新整理,會導致UI介面會卡。

這種使用場景其實比較多,於是自己把這個類繼承封裝了一下,允許暫停通知事件。

話不多說,直接上程式碼:

using System;
using System.Collections.ObjectModel;
using System.Collections.Specialized;

namespace
CgdataBase { 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類,實現批量操作後統一更新。