2016-03-03 52 views
0

我在Windows窗體應用程序中創建了一個項目,其中創建了一個事件。當我單擊瀏覽器中的任何頁面時(即FiddlerApplication.AfterSessionComplete),將引發此事件。現在,每當事件觸發時,我都會將數據添加到ObservableCollection中。要檢查列表計數是否增加,我正在使用ObservableCollection的CollectionChanged事件。如果列表計數沒有增加,我想要引發一個事件。如果可觀察列表數不更新引發事件

ObservableCollection<Session> Sessions = new ObservableCollection<Session>(); 
public void FetchSession() { 
     #region AttachEventListeners   
     FiddlerApplication.AfterSessionComplete += new SessionStateHandler(FiddlerApplication_AfterSessionComplete); 
     Sessions.CollectionChanged += Sessions_CollectionChanged; 

} 
void Sessions_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) 
{ 
    //this fires when Collection count changes 
} 

void FiddlerApplication_AfterSessionComplete(Session oSession) 
{ 
    Monitor.Enter(Sessions); 
    Sessions.Add(oSession); 
    Monitor.Exit(Sessions); 
} 

它們在ObservableCollection類中沒有可用的東西,它可以告訴我Collection數不會增加。我怎樣才能做到這一點?

+0

您知道,您訂閱了哪個活動?收集已更改。當數量不增加時,你會怎麼想?沒有變化。我擔心,你可能也想實現一個異步方法。 可能可以刪除已更改的集合,而是創建兩個自己的事件,如StartObserving和EndObserving,並在兩種方法中比較集合中的條目數量,如果是首選的,則爲異步。 – icbytes

+0

可以請給我一些樣品。 –

+0

因此,您有Montior.Enter ... Monitor.Exit ...您可以在輸入前保存您的Sessions-collection的行計數器。你可以在退出後查詢這個計數器。如果他們是平等的,那麼,你想要什麼,如果不是,做一些不同的事情。 – icbytes

回答

0

您可以創建一個ObservableCollecton<T>的子類,並在Count調用CollectionChanged事件之間的計數未發生變化時添加自己的自定義事件。因此,您基本上保留一個存儲集合計數的私有字段,並在下一個CollectionChanged事件中將當前計數與先前計數進行比較。如果他們是平等的你提高你的自定義事件。

一個可能的實現看起來是這樣的:

public delegate void CountEqual(object sender, EventArgs e); 

public class ObservableCountCollection<T>: ObservableCollection<T> 
{ 
    public CountEqual CountUnchanged; 

    private int _previousCount; 
    private object locker = new object(); 

    public ObservableCountCollection() 
    { 
     this.CollectionChanged += ObservableCountCollection_CollectionChanged; 
     _previousCount = 0; 
    } 

    void ObservableCountCollection_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) 
    { 
     bool raiseEvent = false; 
     var unchanged = CountUnchanged; 
     lock(locker) 
     { 
      raiseEvent = _previousCount == this.Count; 
      _previousCount = this.Count; 
     } 
     if (raiseEvent && unchanged!=null) 
     { 
      unchanged(this, new EventArgs()); 
     } 
    } 
} 

注意,NotifyCollectionChangedEventArgs類型確實有Action財產。對於這個系列我想你也可以做

raiseEvent = (e.Action == NotifyCollectionChangedAction.Replace || 
       e.Action == NotifyCollectionChangedAction.Move); 

這樣你就不會需要保持計數和鎖定結構,但我沒有測試如何,如果你能叫AddRange上集合的作品。我留下了任何後續問題。