使用 move() 修改可观察集合

本文关键字:观察 集合 修改 move 使用 | 更新日期: 2023-09-27 18:36:35

我有一个与修改绑定到 UI 中列表框的可观察集合中的各个项目有关的问题。

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() 修改可观察集合

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()功能将确保您永远不会超出范围。

我认为

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

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

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

加;

newIndex++;

在循环的每次迭代中。

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

for (int i = draggedItems.Count; i >= 0; i--)
{
    . . . 
}