【问题标题】:Event when list has changed列表更改时的事件
【发布时间】:2014-07-25 08:10:54
【问题描述】:

我有一个事件,每当我的列表中的项目发生更改时就会触发该事件,并且当触发此事件时,我会调用一个方法来处理此列表。当列表中有 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 次

希望这会有所帮助

【问题讨论】:

  • 提供一些代码会真的有帮助
  • 您现在如何添加到列表中?你是如何提出这些事件的?在我们提供帮助之前,请告诉我们有关您的代码的更多信息。
  • 添加了我的一些代码
  • 您必须实现BeginUpdate()/EndUpdate() 架构,就像在许多基于集合的控件中所做的那样,将控件重绘推迟到调用EndUpdate()

标签: c# events event-handling eventhandler


【解决方案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;
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-25
    • 2014-12-11
    相关资源
    最近更新 更多