Событие при изменении списка

У меня есть событие, которое запускается всякий раз, когда элементы моего списка меняются, и когда это событие запускается, я вызываю метод для работы с этим списком. Когда в списке 5 новых элементов, мой метод вызывается 5 раз, для каждого нового элемента, но мне нужно обработать только последнее событие. как я могу это решить?

MyObject.ListItemsChanged += RefreshElementsInUI;

затем в методе:

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

событие ListItemsChanged запускается 5 раз, если в моем сообщении есть 5 новых элементов, но мне нужно только последнее событие, потому что мне не нужно выполнять ту же работу примерно 5 раз

надеюсь, это поможет


person patdhlk    schedule 25.07.2014    source источник
comment
предоставление кода было бы действительно полезно   -  person Selman Genç    schedule 25.07.2014
comment
Как вы сейчас пополняете список? Как вы поднимаете события? Расскажите нам больше о своем коде, прежде чем мы сможем помочь.   -  person DavidG    schedule 25.07.2014
comment
добавил часть моего кода   -  person patdhlk    schedule 25.07.2014
comment
Вы должны реализовать схему _1 _ / _ 2_, как это делается во многих элементах управления на основе коллекций, чтобы отложить перерисовку элемента управления до вызова EndUpdate().   -  person Sinatr    schedule 25.07.2014


Ответы (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;
  }
}
person codenheim    schedule 25.07.2014