Pause the Updates to DataGrid of bound ObservableCollection

前端 未结 2 1116
[愿得一人]
[愿得一人] 2020-12-19 14:32

Is there a way to pause the NotifyCollectionChanged event of an ObservableCollection? I thought something like the following:

publ         


        
相关标签:
2条回答
  • 2020-12-19 15:06

    If you do not want to loose any notifications a temporary storage might work, the following might work but is untested:

    public class PausibleObservableCollection<T> : ObservableCollection<T>
    {
        private readonly Queue<NotifyCollectionChangedEventArgs> _notificationQueue
            = new Queue<NotifyCollectionChangedEventArgs>();
    
        private bool _isBindingPaused = false;
        public bool IsBindingPaused
        {
            get { return _isBindingPaused; }
            set
            {
                _isBindingPaused = value;
                if (value == false)
                {
                    while (_notificationQueue.Count > 0)
                    {
                        OnCollectionChanged(_notificationQueue.Dequeue());
                    }
                }
            }
        }
    
        protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
        {
            if (!IsBindingPaused)
                base.OnCollectionChanged(e);
            else
                _notificationQueue.Enqueue(e);
        }
    }
    

    This should push every change that happens while the collection is paused into a queue, which then is emptied once the collection is set to resume.

    0 讨论(0)
  • 2020-12-19 15:18

    To go along with @H.B's answer (I was testing while he/she posted) - you can pass the NotifyCollectionChangedAction.Reset Change Action as an event argument to the CollectionChanged event. Note that this will not be efficient on large collections.

    public class PausibleObservableCollection<T> : ObservableCollection<T>
    {
        private bool _isPaused = false;
        public bool IsPaused 
        { 
          get { return _isPaused; } 
          set 
          { 
              _isPaused = value;
              if (!value)
              { this.OnCollectionChanged(new System.Collections.Specialized.NotifyCollectionChangedEventArgs(System.Collections.Specialized.NotifyCollectionChangedAction.Reset)); }
    
          } 
        }
    
        protected override void OnCollectionChanged(System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
        {
            if (!IsPaused)
            { base.OnCollectionChanged(e); }
        }
    }
    
    0 讨论(0)
提交回复
热议问题