gpt4 book ai didi

c# - 使用 move() 修改 ObservableCollection?

转载 作者:行者123 更新时间:2023-12-02 22:39:24 25 4
gpt4 key购买 nike

我有一个关于修改绑定(bind)到 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 中(删除基本上取消选择列表中的项目..)..所以我需要使用移动方法,

我上面的方法有什么问题,如何解决?谢谢!

最佳答案

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

关于c# - 使用 move() 修改 ObservableCollection?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10940622/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com