use*_*434 2 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);
}
Run Code Online (Sandbox Code Playgroud)
}
但是问题是,如果我将这些项目放在开始拖动第一个项目的索引之前,那么顺序将颠倒...因此集合变为,
{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++;
}
Run Code Online (Sandbox Code Playgroud)
这应该可以帮助您。您需要增加toDropIndex,以便将每个项目移到最后一个项目的前面。否则,您只是将2移至索引3,然后将5移至索引3(将2推至索引4),然后将7移至索引3(将2推至索引5,将5推至索引4)。相反,它将在索引3处放置2,在索引4处放置5,在索引5处放置7。该Math.Min()
函数将确保您永远不会超出范围。