使用move()修改ObservableCollection?

时间:2012-06-07 22:15:41

标签: 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);                                     
  }

}

但问题是,如果我在我开始拖动我的第一个项目的索引之前删除项目,那么顺序就会反转......所以收集变为,

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

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

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

我的方法有什么问题以及如何修复它? 谢谢!

3 个答案:

答案 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--)
{
    . . . 
}
相关问题