如果可观察列表计数未更新,则引发事件
本文关键字:事件 更新 观察 列表 如果 | 更新日期: 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
是如何工作的。我把它留给任何后续问题。