Bonjour,

Voici un deuxième problème (et dernier j'espère) que je traine depuis quelques jours.

Objectif:
Deux listes alimentés par deux dataprovider différents (mais de même structure).
Deux boutons pour permettre d'échanger les données entre ces listes.

Voici un code qui fonctionne:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
			   xmlns:s="library://ns.adobe.com/flex/spark" 
			   xmlns:mx="library://ns.adobe.com/flex/mx"
			   contentCreationComplete="init()">
 
	<fx:Declarations>
		<mx:ArrayCollection id="dataGauche">
			<fx:Object nom="Gauche1"/>
			<fx:Object nom="Gauche2"/>
			<fx:Object nom="Gauche3"/>
			<fx:Object nom="Gauche4"/>
		</mx:ArrayCollection>
 
		<mx:ArrayCollection id="dataDroite">
			<fx:Object nom="Droite1"/>
			<fx:Object nom="Droite2"/>
			<fx:Object nom="Droite3"/>
			<fx:Object nom="Droite4"/>
		</mx:ArrayCollection>
	</fx:Declarations>
 
	<fx:Script>
		<![CDATA[
			import mx.collections.XMLListCollection;
			import spark.components.DataGrid;
 
			private function changeElement(datagrid1:DataGrid, datagrid2:DataGrid):void {
				var toRemove:Array=[];
				for (var i:int=0; i < datagrid2.selectedItems.length; i++)
				{
					toRemove.push(datagrid2.selectedItems[i]);
				}
				for (i=0; i < toRemove.length; i++)
				{
					datagrid1.dataProvider.addItem(toRemove[i]);
					datagrid2.dataProvider.removeItemAt(datagrid2.dataProvider.getItemIndex(toRemove[i]));
				}
			}
			// Supprime les éléments sélectionnés de la liste de droite
			private function deleteSelection():void
			{
				changeElement(datagridGauche, datagridDroite);
			}
			// Ajoute les éléments sélectionnés à la liste de droite
			private function addSelection():void
			{
				changeElement(datagridDroite, datagridGauche);
			}
		]]>
	</fx:Script>
 
	<s:HGroup>
		<!-- liste de gauche -->
		<s:DataGrid id="datagridGauche"	dataProvider="{dataGauche}">
			<s:columns>
				<s:ArrayList>
					<s:GridColumn dataField="nom"/>
				</s:ArrayList>
			</s:columns>
		</s:DataGrid>
 
		<!-- bouton d'échange -->
		<s:VGroup verticalAlign="middle" height="100%">
			<s:Button id="btnAjout" label="&gt;" click="addSelection()"/>				
			<s:Button id="btnSuppr" label="&lt;" click="deleteSelection()"/>
		</s:VGroup>
 
		<!-- liste de droite -->
		<s:DataGrid id="datagridDroite" dataProvider="{dataDroite}">
			<s:columns>
				<s:ArrayList>
					<s:GridColumn dataField="nom"/>
				</s:ArrayList>
			</s:columns>
		</s:DataGrid>
	</s:HGroup>
</s:Application>
Ce code fonctionne, par contre, si je change le dataprovider pour le mettre en XML (dans la partie fxeclarations), cela ne fonctionne plus:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
<fx:XML id="xmlDataGauche" source="xml/xmlDataGauche.xml"/>
		<fx:XML id="xmlDataDroite" source="xml/xmlDataDroite.xml"/>
		<s:XMLListCollection id="dataGauche" source="{xmlDataGauche..element}"/>
		<s:XMLListCollection id="dataDroite" source="{xmlDataDroite..element}"/>
Voici les fichiers xml correspond:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<provider>
	<element>
		<nom>Gauche1</nom>
	</element>
	<element>
		<nom>Gauche2</nom>
	</element>
	<element>
		<nom>Gauche3</nom>
	</element>
	<element>
		<nom>Gauche4</nom>
	</element>
</provider>
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<provider>
	<element>
		<nom>Droite1</nom>
	</element>
	<element>
		<nom>Droite2</nom>
	</element>
	<element>
		<nom>Droite3</nom>
	</element>
	<element>
		<nom>Droite4</nom>
	</element>
</provider>
Ici, l'élément disparaitre de la première liste, mais n'apparait dans la seconde, et lorsque, je fais l'échange inverse, les éléments supprimés précédemment réapparaissent.

Pourquoi ai-je ce comportement. Dans le principe, dans les deux cas on est sur des classes héritant de ListCollectionView, je fais des addItem sur des objects de même type.