Je sais que tu as dit "liste générique", mais tu n'as pas précisé que tu devais utiliser la fonction Liste(T) alors voici une tentative de quelque chose de différent.
Le site Collection Observable(T) a un Méthode de déplacement qui fait exactement ce que vous voulez.
public void Move(int oldIndex, int newIndex)
En dessous, il y a En gros, mis en œuvre comme ça.
T item = base[oldIndex];
base.RemoveItem(oldIndex);
base.InsertItem(newIndex, item);
Ainsi, comme vous pouvez le constater, la méthode d'échange que d'autres ont suggérée est essentiellement ce que la Collection d'Observables dans sa propre méthode Move.
MISE À JOUR 2015-12-30 : Vous pouvez voir le code source de la Déplacements et MoveItem dans corefx maintenant pour vous-même sans utiliser Reflector/ILSpy puisque .NET est open source.
2 votes
Vous devez modifier la réponse que vous avez cochée. Celle avec
newIndex--
n'aboutit pas au comportement que vous avez dit vouloir.2 votes
@Miral - Selon vous, quelle réponse devrait être acceptée ?
4 votes
De jpierson. Il en résulte que l'objet qui se trouvait à oldIndex avant le déplacement se retrouve à newIndex après le déplacement. C'est le comportement le moins surprenant (et c'est ce dont j'avais besoin lorsque j'écrivais un code de réorganisation par glisser-déposer). Il est vrai qu'il parle de
ObservableCollection
et non un génériqueList<T>
Mais il est facile d'intervertir les appels de méthode pour obtenir le même résultat.0 votes
La demande (et correctement mis en œuvre dans cette réponse ) pour déplacer l'élément entre les éléments à
[newIndex - 1]
et[newIndex]
n'est pas inversible.Move(1, 3); Move(3, 1);
ne ramène pas la liste à son état initial. En attendant, un comportement différent est fourni dansObservableCollection
et mentionné dans cette réponse qui est inversible .