2011-03-30 70 views
4

有沒有辦法可以暫停的NotifyCollectionChanged事件?我想類似如下:將更新暫停到綁定的ObservableCollection的DataGrid <T>

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中,當我啓用通知再次。

爲了控制這個方面,我必須想出一個集合的自定義實現嗎?

回答

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

這應該推動每而收集暫停到隊列中出現這種情況的變化,然後一旦集合恢復,它就會被清空。

+0

看起來像一個有希望和明確的方法。我會嘗試一下,讓你知道它是如何工作的... – rdoubleui 2011-03-31 18:34:45

+0

按照建議很好地工作,我更喜歡這個overdugas的方法,因爲我將在我的DataGrid中有幾千個項目。簡單和工作。 – rdoubleui 2011-04-01 14:40:45

+0

很高興聽到:) – 2011-04-01 15:44:11

1

爲了配合@ H.B的回答(我在測試他/她發佈時) - 您可以將NotifyCollectionChangedAction.Reset Change Action作爲事件參數傳遞給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

也將看看這種方法,謝謝。 – rdoubleui 2011-03-31 18:36:55

+0

我試過了,按預期工作。不過,我的DataGrid中會有幾千個項目。正如我讀到的,'NotifyCollectionChangedAction.Reset'基本上告訴網格綁定所有項目 - 所以你關於性能的提示是至關重要的。但很高興知道,有這樣一個選項。 – rdoubleui 2011-04-01 14:44:38

0

如果您試圖通過只有一個通知來向可觀察集合添加項目列表。你可以嘗試實現一個AddRange。我認爲this可能是一個很好的例子。

+0

不,我不是在找什麼。我獲得了該DataGrid的最新更新,並希望阻止Grid更新一段時間(當我想要選擇多行時)。 – rdoubleui 2011-03-31 18:36:28

相關問題