是什么导致BindingList中的ListChangedType.ItemMoved ListChange事件<t>?</t>

时间:2009-08-06 04:31:02

标签: c# list events bindinglist

我有一个 BindingList(T),我在 DataGrid 中显示。我正在关注 ListChanged 事件,并在引发 ListChanged 事件时执行不同的操作。

我正在检查事件的 ListChangeType 参数,以检查列表的更改方式,然后相应地进行响应。但是,我注意到 ListChanged 事件类型 ItemMoved

我有“上移”和“下移”按钮,可以在列表中上下移动项目。但这些实际上是删除了所选项目,然后将其重新插入更高或更低的位置。

但是,我没有看到 BindingList(T)的任何方法看起来会移动列表中的项目。所以我错过了一些东西,或者只是没有办法在BindingList中移动一个也会引起ItemMoved类型的ListChanged事件的项目?

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 个答案:

答案 0 :(得分:10)

不幸的是,BindingList中的任何内容都不会引发ListChanged类型设置为ListChangedType.ItemMoved的ListChanged事件。 BindingList继承自Collection,它不为列表中的“移动”项提供任何类型的支持。 BindingList也不会为此类行为添加任何支持。

如果您确实需要/想要响应ListChangedType.ItemMoved事件,您最好的选择是从BindingList派生自己的类并提供您自己的Move方法。在这些方法中,您需要暂时挂起引发ListChanged事件,通过删除/添加来执行移动,使用相应的ItemMoved ListChangedType自行引发ListChanged事件,然后恢复引发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 :(得分:1)

如果绑定源应用了一个排序,它会触发,如果您更改了排序字段中保存的数据,然后它会更改记录的位置,然后触发事件。

答案 2 :(得分:1)

与Scott的答案类似,你可以做类似这种扩展方法的事情:

//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&lt;&gt;。完成移动列表中的项目后,可以引发Reset事件(使用ResetBindings())。可能会有帮助...