BindingList ListChanged事件触发两次

时间:2014-06-03 14:22:05

标签: vb.net

我正在使用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

其他信息:

  • ItemDeleted也是两次射击
  • 在重复事件中,callstack不会更改甚至滚动,因此两者似乎都来自同一个地方。
  • 我从第一次存储了e事件参数并将其与第二次的If e Is lastE事件进行了比较,并且它们是相同的对象,因此看起来过程实际上就是同一事件两次。如果另一个程序是重复的,我期待一个新的e实例,它不匹配最后一个。

是否有类似e.Handled的内容或我遗漏的整体属性设置?我很想从BindingList继承使用一些覆盖来解决问题,但这是应用程序的一个微不足道的方面。

1 个答案:

答案 0 :(得分:1)

确保您没有订阅该活动两次。事件将为每个订阅者回调,即使该订阅者已经存在。