我有一个问题涉及修改绑定到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中(删除基本上取消选择列表中的项目..)....所以我需要使用移动方法,
我的方法有什么问题以及如何修复它? 谢谢!
答案 0 :(得分: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)。相反,这将在索引3处放置2,在索引4处放置5,在索引5处放置7. Math.Min()
函数将确保您永远不会超出范围。
答案 1 :(得分:0)
我认为在你之前插入它们时,你应该使用newIndex - 1.试试看它是否有效。
LE:实际上,我认为它是+1
答案 2 :(得分:0)
我推测这是因为你没有增加每个项目的'drop index',所以选择顺序(2,5,7)中的每一个都被插入索引'3',这将在它们中显示逆序。
添加;
newIndex++;
在循环的每次迭代中。
或者,或者反过来枚举你的收藏品;
for (int i = draggedItems.Count; i >= 0; i--)
{
. . .
}