2

我有一个与修改绑定到 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);                                     
  }

}

但问题是,如果我将项目放在开始拖动第一个项目的索引之前,则顺序会颠倒......所以集合变成,

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

如果我在索引 3 之后删除它可以正常工作,但如果我在 3 之前删除它,那么顺序就会颠倒。

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

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

4

3 回答 3

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++;
}

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

于 2012-06-07T22:35:49.090 回答
0

我认为当您之前插入它们时,您应该使用 newIndex - 1。尝试看看它是否有效。

LE:实际上,我认为是+1

于 2012-06-07T22:24:44.987 回答
0

我推测这是因为您没有增加每个项目的“放置索引”,因此选择顺序(2、5、7)中的每个项目都被插入到索引“3”处,这将以相反的顺序显示它们。

添加;

newIndex++;

在循环的每次迭代中。

或者,反向枚举您的集合;

for (int i = draggedItems.Count; i >= 0; i--)
{
    . . . 
}
于 2012-06-07T22:25:42.123 回答