是什么原因导致BindingList <T>中的ListChangedType.ItemMoved ListChange事件?

Eri*_*tas 12 c# events list 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
    }
}
Run Code Online (Sandbox Code Playgroud)

Sco*_*man 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;
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

*完全未经测试的代码,但它应该说明要点.

  • 主要观点看起来是正确的,我想应该指出,将项目移动到较低的索引将无法使用此代码 - this.Remove(item)将移动索引.至少你一次性插入你的项目,在最坏的情况下,你试图插入列表的末尾. (4认同)