2

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での選択を維持できるという利点があります(削除すると、基本的にリスト内のアイテムの選択が解除されます)。 ....だから私はmoveメソッドを利用する必要があります、

上記の私の方法の何が問題になっていますか、そしてそれを修正する方法は?ありがとう!

4

3 に答える 3

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()関数により、範囲外になることはありません。

于 2012-06-07T22:35:49.090 に答える
0

前に挿入するときは、newIndex-1を使用する必要があると思います。それが機能するかどうか試してみてください。

LE:実は、+1だと思います

于 2012-06-07T22:24:44.987 に答える
0

アイテムごとに「ドロップインデックス」を増やしていないためだと思います。そのため、選択順序(2、5、7)のそれぞれがインデックス「3」に挿入され、逆の順序で表示されます。

追加;

newIndex++;

ループの各反復で。

または、コレクションを逆に列挙します。

for (int i = draggedItems.Count; i >= 0; i--)
{
    . . . 
}
于 2012-06-07T22:25:42.123 に答える