Приостановить обновление в DataGrid связанной ObservableCollection <T> - PullRequest
4 голосов
/ 30 марта 2011

Есть ли способ приостановить NotifyCollectionChanged событие ObservableCollection?Я подумал что-то вроде следующего:

public class PausibleObservableCollection<Message> : ObservableCollection<Message>
{
    public bool IsBindingPaused { get; set; }

    protected override void OnCollectionChanged(System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
    {
        if (!IsBindingPaused)
            base.OnCollectionChanged(e);
    }
}

Это действительно приостанавливает уведомление, но очевидно, что тогда оставленные (но все еще добавленные) элементы находятся в пределах NotifyCollectionChangedEventArgs и, следовательно, не передаются в связанную DataGrid, когдаЯ снова включаю уведомление.

Придется ли мне придумывать собственную реализацию коллекции, чтобы управлять этим аспектом?

Ответы [ 3 ]

5 голосов
/ 30 марта 2011

Если вы не хотите терять какие-либо уведомления, временное хранилище может работать, следующее может работать, но не проверено:

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);
    }
}

Это должно отодвинуть каждое изменение, которое происходит, когда коллекция приостановлена, в очередь, который затем очищается после возобновления сбора.

1 голос
/ 31 марта 2011

Чтобы согласиться с ответом @ HB (я проводил тестирование, пока он / она публиковали), вы можете передать NotifyCollectionChangedAction.Reset Изменить действие в качестве аргумента события для события CollectionChanged.Обратите внимание, что это не будет эффективно в больших коллекциях.

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 голосов
/ 31 марта 2011

Если вы пытаетесь добиться добавления списка элементов в наблюдаемую коллекцию с помощью только одного уведомления.Вы можете попробовать реализовать AddRange.Я думаю это может быть хорошим примером.

...