2010-11-26 4 views
0

J'ai une ArrayCollection imbriquée dans une autre. J'ai besoin de trier la collection enfant par un champ. J'ai essayé le code suivant. Cela fonctionne bien pour la collection parent, mais ne fait rien pour l'enfant. Je ne peux pas comprendre ce que je fais mal, donc de l'aide serait appréciée.ArrayCollections Flex imbriqué tri

Merci à l'avance,

Répondre

0

Je ne sais pas exactement pourquoi cela se produit. Cependant, il semble que sort est héritée de ses collections enfants ...

Serait-il possible de trier les elmenents en childData par valueet par otherValue? Dans ce cas, vous pouvez utiliser un IHierarchicalCollectionView pour trier tous les éléments. Jetez un oeil à l'exemple suivant:

<?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" initialize="init()"> 

    <fx:Script> 
     <![CDATA[ 
      import mx.collections.ArrayCollection; 
      import mx.collections.HierarchicalCollectionView; 
      import mx.collections.HierarchicalData; 
      import mx.collections.IHierarchicalCollectionView; 
      import mx.collections.Sort; 
      import mx.collections.SortField; 

      private var records:ArrayCollection = new ArrayCollection([ 
       new Data("S", null, new ArrayCollection([ 
        new Data(null, "R", null), 
        new Data(null, "B", null), 
        new Data(null, "L", null) 
       ])), 
       new Data("A", null, new ArrayCollection([ 
        new Data(null, "P", null), 
        new Data(null, "O", null) 
       ])), 
       new Data("X", null, new ArrayCollection([ 
        new Data(null, "C", null), 
        new Data(null, "F", null), 
        new Data(null, "E", null) 
       ])) 
       ]); 

      [Bindable] 
      private var hierarchicalView:IHierarchicalCollectionView; 

      private function init():void 
      { 
       var hierarchicalRecords:HierarchicalData = new HierarchicalData(records); 

       // you don't need this if your field is named 'children' which is the default... 
       hierarchicalRecords.childrenField = "childrenData"; 

       hierarchicalView = new HierarchicalCollectionView(hierarchicalRecords); 
       sortData(hierarchicalView); 
      } 

      private function sortData(view:IHierarchicalCollectionView):void 
      { 
       var x:ArrayCollection; 
       view.sort = new Sort(); 
       view.sort.fields = [new SortField('value', true, false), new SortField('otherValue', true, false)]; 
       view.refresh(); 
      } 
     ]]> 
    </fx:Script> 

    <s:layout> 
     <s:HorizontalLayout horizontalAlign="center" verticalAlign="middle"/> 
    </s:layout> 

    <mx:AdvancedDataGrid designViewDataType="tree" height="80%" dataProvider="{hierarchicalView}" 
         creationComplete="event.currentTarget.expandAll()"> 
     <mx:columns> 
      <mx:AdvancedDataGridColumn dataField="value"/> 
      <mx:AdvancedDataGridColumn dataField="otherValue"/> 
     </mx:columns> 
    </mx:AdvancedDataGrid> 
</s:Application> 

Une autre option serait d'écrire un compareFunction qui compare vos objets en conséquence.