如果可观察列表计数未更新,则引发事件

本文关键字:事件 更新 观察 列表 如果 | 更新日期: 2023-09-27 18:37:14

我在Windows表单应用程序中有一个项目,我在其中创建了一个事件。当我点击浏览器中的任何页面(即FiddlerApplication.AfterSessionComplete)时,就会引发此事件。现在,每当事件触发时,我都会将数据添加到可观察集合中。为了检查列表计数是否在增加,我正在使用 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 类中没有任何可用的东西可以告诉我集合计数没有增加。我该怎么做?

如果可观察列表计数未更新,则引发事件

您可以

创建 ObservableCollecton<T> 的子类,并在调用CollectionChanged事件之间 Count 未更改时添加自己的自定义事件。因此,您基本上保留了一个存储集合计数的私有字段,并在下一个 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是如何工作的。我把它留给任何后续问题。