我正在使用ListChanged事件BindingList(Of Foo)
在列表内容发生更改时通知未绑定的控件。我只担心添加或删除的项目。问题是每次添加或删除操作都会触发两次事件。
应用程序添加如下项目:
For n As Integer = 0 To 5
a = CreateItem(n) ' create test object
BList.Add(a) ' add to BindingList
Next
事件的处理方式如下:
Private Sub _BListChanged(sender As Object, e As ListChangedEventArgs)
Handles _BListSource.ListChanged
' ...
Select Case e.ListChangedType
Case ListChangedType.ItemAdded
' add item to control
AddItem(_BListSource(e.NewIndex))
' show whats happening
Console.WriteLine("ev {0} old {1} new {2} obj count {3} name{4}",
e.ListChangedType.ToString,
e.OldIndex.ToString,
e.NewIndex.ToString,
_BListSource.Count.ToString,
_BListSource(e.NewIndex).ToString)
控制台调试显示它被调用两次(除了控件加倍项目之外):
ev ItemAdded old -1 new 0 obj count 1 name Able
ev ItemAdded old -1 new 0 obj count 1 name Able
ev ItemAdded old -1 new 1 obj count 2 name Baker
ev ItemAdded old -1 new 1 obj count 2 name Baker
ev ItemAdded old -1 new 2 obj count 3 name Charlie
ev ItemAdded old -1 new 2 obj count 3 name Charlie
其他信息:
e
事件参数并将其与第二次的If e Is lastE
事件进行了比较,并且它们是相同的对象,因此看起来过程实际上就是同一事件两次。如果另一个程序是重复的,我期待一个新的e实例,它不匹配最后一个。是否有类似e.Handled
的内容或我遗漏的整体属性设置?我很想从BindingList
继承使用一些覆盖来解决问题,但这是应用程序的一个微不足道的方面。
答案 0 :(得分:1)
确保您没有订阅该活动两次。事件将为每个订阅者回调,即使该订阅者已经存在。