Что вызывает событие ListChangedType.ItemMoved ListChange в BindingList <T>? - PullRequest
12 голосов
/ 06 августа 2009

У меня есть BindingList (T) , который я отображаю в DataGrid . Я наблюдаю за событиями ListChanged и выполняю различные действия, когда вызывается событие ListChanged .

Я проверяю аргумент ListChangeType события, чтобы проверить, как был изменен список, а затем отвечаю соответствующим образом. Однако я заметил, что существует ListChanged тип события ItemMoved .

У меня есть кнопки «Вверх» и «Вниз» для перемещения элементов вверх и вниз по списку. Но они фактически удаляют выбранный элемент, а затем снова вставляют его в более высокое или более низкое положение.

Однако я не вижу метода BindingList (T) , который бы выглядел так, как если бы он перемещал элемент в списке. Итак, я что-то упустил или просто нет способа переместить элемент в BindingList, который также вызвал бы событие ListChanged типа ItemMoved?

void FloorCollection_ListChanged(object sender, ListChangedEventArgs e)
{
    if (e.ListChangedType == ListChangedType.ItemAdded)
    {    
        //DO STUFF
    }
    else if (e.ListChangedType == ListChangedType.ItemDeleted)
    {
        //DO STUFF
    }
    else if (e.ListChangedType == ListChangedType.ItemMoved)
    {
        //HOW DO I GET THIS CODE TO RUN?
    }
    else if (e.ListChangedType == ListChangedType.ItemChanged)
    {
        //DO STUFF
    }
}

Ответы [ 3 ]

10 голосов
/ 17 августа 2009

К сожалению, ничто в BindingList не вызовет событие ListChanged с ListChangedType, установленным в ListChangedType.ItemMoved. BindingList наследуется от Collection, которая не предоставляет никакой поддержки для «перемещения» элементов в списке. BindingList также не добавляет поддержки для этого типа поведения.

Если вам действительно нужно / нужно отвечать на события ListChangedType.ItemMoved, ваш лучший вариант - извлечь собственный класс из BindingList и предоставить свои собственные методы Move. Внутри этих методов вам нужно временно приостановить создание событий ListChanged, выполнить перемещение, удалив / добавив, вызвать событие ListChanged самостоятельно с помощью соответствующего ItemMoved ListChangedType, а затем отменить приостановку вызова событий ListChanged.

Это будет выглядеть примерно так *:

public class CustomBindingList<T> : BindingList<T>
{
   public void Move(T item, int index)
   {
      bool raiseListChangedEvents = this.RaiseListChangedEvents;
      try
      {
         this.RaiseListChangedEvents = false;
         int oldIndex = this.IndexOf(item);
         this.Remove(item);
         this.InsertItem(index, item);    
         this.OnListChanged(new ListChangedEventArgs(ListChangedType.ItemMoved, index, oldIndex));
      }
      finally
      {
         this.RaiseListChangedEvents = raiseListChangedEvents;
      }
   }
}

* Полностью непроверенный код, но он должен проиллюстрировать основные моменты.

1 голос
/ 25 ноября 2010

Аналогично ответу Скотта, вы можете сделать что-то вроде этого метода расширения:

//Dumping ground for miscellaneous functions
public static class Misc
{
   //Swap items at index positions 'index0' and 'index1' in the list
   public static void Swap<T>(this BindingList<T> list, int index0, int index1, bool reset_bindings)
   {
      if (index0 == index1) return;
      bool raise_events = list.RaiseListChangedEvents;
      try
      {
         list.RaiseListChangedEvents = false;
         T tmp = list[index0];
         list[index0] = list[index1];
         list[index1] = tmp;
         list.RaiseListChangedEvents = raise_events;
         if (reset_bindings) list.ResetBindings();
      }
      finally
      {
         list.RaiseListChangedEvents = raise_events;
      }
   }
}

Это не создает события ItemMoved, после которых вы были, но избавляет от необходимости создавать подкласс BindingList <>. Вы можете вызвать событие Reset (используя ResetBindings ()), как только вы закончили перемещение элементов в списке. Может быть полезно ...

1 голос
/ 08 февраля 2010

Это срабатывает, если к источнику привязки применена сортировка, если вы измените данные и данные, хранящиеся в поле сортировки, а затем изменит позицию записи, то событие сработает.

...