0

我有一个事件,每当我的列表中的项目发生更改时就会触发该事件,并且当触发此事件时,我会调用一个方法来处理此列表。当列表中有 5 个新项目时,我的方法被调用 5 次,foreach 新元素,但我只需要处理最后一个事件。我该如何解决这个问题?

MyObject.ListItemsChanged += RefreshElementsInUI;

然后在方法中:

private void RefreshElementsInUI(object sender, EventArgs e)
{   
    var listItems = getElementsForCommunication(communication);
    ClearElementsInUi();
    foreach ( var element in listItems ) 
         addElementToMyControl(element);
}

如果我的通信中有 5 个新项目,ListItemsChanged 事件会被触发 5 次,但我只需要最后一个事件,因为我不必做同样的工作大约 5 次

希望这会有所帮助

4

1 回答 1

1

看来您已经实现了 IBindingList 或正在使用 BindingList。我建议从ObservableCollection派生并定义OnCollectionChanged。批处理模式未内置到任何事件驱动的 .NET 集合(BindingList、ObservableCollection)中,但通过从 ObservableCollection 派生然后编写批处理方法 AddRange() 来实现您自己的集合并不难。

public class MegaList<T> : ObservableCollection<T>
{
  // Initialize new instance of Gyrasoft.Common.MegaList<T> with elements from collection. 
  public MegaList(IEnumerable<T> collection)
     : base(collection) { }

  /// Adds the elements of specified collection in batch mode, fire event once after 
  public MegaList<T> AddRange(IEnumerable<T> collection)
  {
     foreach (var i in collection)
        Items.Add(i);

     OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
     return this;
  }
}
于 2014-07-25T08:30:44.550 回答