使用 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 中(删除基本上取消选择列表中的项目..........所以我需要使用移动方法,
我的上述方法有什么问题以及如何解决?谢谢!
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--)
{
. . .
}