2010-10-29 28 views
2

J'ai un DataGrid qui contient une liste déroulante Spark qui doit obtenir des données dynamiques. Le DataGrid utilise un DataProvider distinct. Lorsque j'utilise une ArrayCollection statique dans ma ItemRenderer, cela fonctionne (voir la liste 1). Cependant, lorsque j'utilise Swiz pour médiatiser un événement 'list complete' pour charger l'ArrayCollection, la liste déroulante n'affiche pas les nouvelles données (voir liste 2). En utilisant le débogueur, j'ai inspecté la dropdownlist ItemRenderer et ai confirmé que les nouvelles données sont en cours de chargement dans ArrayCollection. Les nouvelles données ne sont pas affichées dans le contrôle de l'interface utilisateur. J'ai essayé invalidateProperties() + validateNow() et les événements dispatching sur le contrôle et le rendu (this), mais rien ne semble faire apparaître les nouvelles données dans le contrôle sur la grille de données.DynamicSpark DropDownList ItemRenderer dans Flex Datagrid

S'il vous plaît aider !!!

Liste 1: Datagrid et ArrayCollection statique (cela fonctionne):

<mx:DataGrid x="10" y="25" width="98%" id="dgInventory" paddingLeft="25" paddingRight="25" paddingTop="25" paddingBottom="25" 
        editable="true" 
        itemClick="dgInventory_itemClickHandler(event)" dataProvider="{acInventory}" 
        creationComplete="dgInventory_creationCompleteHandler(event)" 
        height="580"> 
      <mx:columns> 
       <mx:DataGridColumn headerText="Item" dataField="itemName" itemRenderer="components.ItemRendererItem" 
            rendererIsEditor="true" editorDataField="selection" editable="true"/> 
       <mx:DataGridColumn headerText="Quantity Required" dataField="quantityReq" itemRenderer="components.ItemRendererQuantityRequired" 
            rendererIsEditor="true" editorDataField="selection" editable="true"/> 
      </mx:columns> 
</mx:DataGrid> 

<fx:Script> 
    <![CDATA[  

     import mx.collections.ArrayCollection; 
     import spark.events.IndexChangeEvent; 

     public var selection:int; 

     [Bindable] 
     protected var acItem:ArrayCollection = new ArrayCollection(
      [ { itemName: "Item1"}, 
       { itemName: "Item2"}, 
       { itemName: "Item3"}, 
      ]); 
    // 
     protected function dropdownlist1_changeHandler(e:IndexChangeEvent):void 
     { 
      selection = e.newIndex; 
     } 

    ]]> 
</fx:Script> 

<s:DropDownList id="ddlItem" prompt="Select Item" dataProvider="{acItem}" labelField="itemName" 
       selectedIndex="{int(dataGridListData.label)}" 
       change="dropdownlist1_changeHandler(event)" 
       width="80%" top="5" bottom="5" left="5" right="5"/> 

Listing 2: Dynamic ArrayCollection (ne fonctionne pas):

<?xml version="1.0" encoding="utf-8"?> 
<s:MXDataGridItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009" 
          xmlns:s="library://ns.adobe.com/flex/spark" 
          xmlns:mx="library://ns.adobe.com/flex/mx" 
          focusEnabled="true"> 

    <fx:Script> 
     <![CDATA[  
      import event.ItemEvent; 

      import mx.collections.ArrayCollection; 
      import mx.events.FlexEvent; 

      import spark.events.IndexChangeEvent; 

      public var selection:int; 
     // 
      [Bindable] 
      protected var acItem:ArrayCollection = new ArrayCollection(); 
     // 
      protected function dropdownlist1_changeHandler(e:IndexChangeEvent):void 
      { 
       selection = e.newIndex; 
      } 
     // 
      protected function ddlItem_creationCompleteHandler(event:FlexEvent):void 
      { 
       var eve : ItemEvent = new ItemEvent(ItemEvent.LIST_ITEM_REQUESTED); 
       dispatchEvent(eve); 
      } 
     // 
      [Mediate(event="ItemEvent.LIST_ITEM_COMPLETE", properties="acItem")] 
      public function refreshness(_acItem : ArrayCollection):void 
      { 
       acItem.removeAll(); 

       var len:int = _acItem.length; 

       if (len > 0) 
       { 
        for (var i:int=0; i < len; i++) 
        { 
         var newItem:Object = new Object; 
         newItem["itemName"] = _acItem[i].itemName; 
         acItem.addItem(newItem); 
        } 
       } 
       this.invalidateProperties(); 
       this.validateNow(); 
       //dispatchEvent(new FlexEvent(FlexEvent.DATA_CHANGE)); 
      } 

     ]]> 
    </fx:Script> 

    <s:DropDownList id="ddlItem" prompt="Select Item" dataProvider="{acItem}" labelField="itemName" 
        selectedIndex="{int(dataGridListData.label)}" 
        creationComplete="ddlItem_creationCompleteHandler(event)" 
        change="dropdownlist1_changeHandler(event)" 
        width="80%" top="5" bottom="5" left="5" right="5"/> 
</s:MXDataGridItemRenderer> 

Répondre

2

Après avoir relu la série ItemRenderer de Peter Ent, cela s'est avéré assez simple.

J'étendu DataGrid avoir la propriété ArrayCollection je avais besoin, puis a ajouté à mon renderer:

[Bindable] 
      protected var acItem:ArrayCollection = new ArrayCollection(); 
     // 
      override public function set data(value:Object) : void 
      { 
       super.data = value; 
       acItem = (listData.owner as MyDataGrid).itemList; // get the data from the renderer's container (by extending it to add a property, if necessary) 
      }