暂停绑定的ObservableCollection <t> </t>的DataGrid更新

时间:2011-03-30 18:53:16

标签: wpf data-binding observablecollection

有没有办法暂停NotifyCollectionChanged的{​​{1}}事件?我想到了以下几点:

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); } } 内,因此当我再次启用通知时,它们不会传递给绑定的DataGrid。

我是否必须想出一个集合的自定义实现来控制这个方面?

3 个答案:

答案 0 :(得分:5)

如果您不想丢失任何通知,临时存储可能会起作用,则以下操作可能有效,但未经测试:

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 :(得分:1)

与@H.B的答案一致(我在他/她发布时进行测试) - 您可以将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); }
    }
}

答案 2 :(得分:0)

如果您尝试仅使用一个通知向可观察集合中添加项目列表。您可以尝试实现AddRange。我认为this可能是一个很好的例子。