使用move()修改ObservableCollection?

use*_*434 2 c# wpf observablecollection

我有一个与修改绑定到UI中的ListBox的ObservableCollection中的各个项目有关的问题。

UI中的用户可以多选项目,然后将其放在特定的索引处以对其重新排序。

因此,如果我有项目{0,1,2,3,4,5,6,7,8,9},用户可以选择项目2、5、7(按此顺序)并将其放置在索引3处,这样收藏就变成了,

{0,1,3,2,5,7,4,8,9}

我现在的工作方式是在控件上的ondrop()方法内部,例如:

foreach (Item item in draggedItems)
{
   int oldIndex = collection.IndexOf(item.DataContext as MyItemType);
   int newIndex = toDropIndex;

  if (newIndex == collection.Count)
  {
         newIndex--;
  }

  if (oldIndex != newIndex)
  {
     collection.Move(oldIndex, newIndex);                                     
  }
Run Code Online (Sandbox Code Playgroud)

}

但是问题是,如果我将这些项目放在开始拖动第一个项目的索引之前,那么顺序将颠倒...因此集合变为,

{0,1,3,7,5,2,4,8,9}

如果我在索引3之后删除,它会很好地工作,但是如果我在3之前删除它,那么顺序将相反。

现在,我可以执行一个简单的删除操作,然后将所有项目插入想要的索引中,但是对我来说,“移动”具有将选择保留在ui中的优点(删除基本上取消了列表中的项目的选择。) ....所以我将需要使用move方法,

我上面的方法有什么问题以及如何解决?谢谢!

m-y*_*m-y 5

foreach (Item item in draggedItems)
{
    int oldIndex = collection.IndexOf(item.DataContext as MyItemType);
    int newIndex = Math.Min(toDropIndex, (collection.Count - 1));

    if (oldIndex == newIndex)
        continue;

    collection.Move(oldIndex, newIndex);

    if (oldIndex > newIndex)
        toDropIndex++;
}
Run Code Online (Sandbox Code Playgroud)

这应该可以帮助您。您需要增加toDropIndex,以便将每个项目移到最后一个项目的前面。否则,您只是将2移至索引3,然后将5移至索引3(将2推至索引4),然后将7移至索引3(将2推至索引5,将5推至索引4)。相反,它将在索引3处放置2,在索引4处放置5,在索引5处放置7。该Math.Min()函数将确保您永远不会超出范围。