有没有办法暂停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。
我是否必须想出一个集合的自定义实现来控制这个方面?
答案 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可能是一个很好的例子。