2010-08-20 17 views
5

Estoy tratando de llegar al campo de datos de una DataGridColumn en el itemRenderer. A continuación se muestra la cuadrícula de datos:Flex 3: ¿Cómo obtengo DataFieldColumn's dataField en su ItemRenderer?

<mx:Script> 
    <![CDATA[ 
     [Bindable] public var weeksOfMoth:ArrayCollection = new ArrayCollection([ 
       {monday:30, tuesday:31, wednesday:1, thursday:2, friday:3, saturday:4, sunday:5}, 
       {monday:6, tuesday:7, wednesday:8, thursday:9, friday:10, saturday:11, sunday:12}, 
       {monday:13, tuesday:14, wednesday:15, thursday:16, friday:17, saturday:18, sunday:19}, 
       {monday:20, tuesday:21, wednesday:22, thursday:23, friday:24, saturday:25, sunday:26}, 
       {monday:27, tuesday:28, wednesday:29, thursday:30, friday:1, saturday:2, sunday:3} 
      ]); 
    ]]> 
</mx:Script> 
<mx:DataGrid dataProvider="{weeksOfMoth}" > 
    <mx:columns> 
     <mx:DataGridColumn itemRenderer="view.DateRenderer" dataField="monday" /> 
     <mx:DataGridColumn itemRenderer="view.DateRenderer" dataField="tuesday" /> 
     <mx:DataGridColumn itemRenderer="view.DateRenderer" dataField="wednesday" /> 
     <mx:DataGridColumn itemRenderer="view.DateRenderer" dataField="thursday" /> 
     <mx:DataGridColumn itemRenderer="view.DateRenderer" dataField="friday" /> 
     <mx:DataGridColumn itemRenderer="view.DateRenderer" dataField="saturday" /> 
     <mx:DataGridColumn itemRenderer="view.DateRenderer" dataField="sunday" /> 
    </mx:columns> 
</mx:DataGrid> 

Y esta es mi itemRenderer:

<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" > 
    <mx:Box > 

        <!-- How do I get the dataField here?? --> 
     <mx:Label text="{data[dataField]}" /> 
    </mx:Box> 
</mx:Canvas> 

En la función de datos del conjunto de la itemRenderer, recibo una semana entera (que está bien), pero el itemRenderer doesn' Saber qué día usar porque DataField es desconocido. ¿Alguien sabe cómo llegar a este campo de datos en el itemRenderer?

Respuesta

7

El comentario de www.Flextras.com me ayudó a encontrar la solución. De hecho, puedo usar listData.dataField, pero primero debe implementarse la clase IDropInListItemRenderer.

La final ItemRenderer:

<?xml version="1.0" encoding="utf-8"?> 
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" implements="mx.controls.listClasses.IDropInListItemRenderer" > 
    <mx:Script> 
     <![CDATA[ 
      import mx.controls.dataGridClasses.DataGridListData; 
      import mx.controls.listClasses.BaseListData; 


      // Internal variable for the property value. 
      private var _listData:DataGridListData; 

      // Make the listData property bindable. 
      [Bindable("dataChange")] 

      // Define the getter method. 
      public function get listData():BaseListData 
      { 
       return _listData; 
      } 

      // Define the setter method, 
      public function set listData(value:BaseListData):void 
      { 
       _listData = DataGridListData(value); 
      } 

     ]]> 
    </mx:Script> 
    <mx:Box width="80%" height="80%" verticalCenter="0" horizontalCenter="0" backgroundColor="#FFFFFF"> 
     <mx:Label text="{data[_listData.dataField]}" /> 
    </mx:Box> 
</mx:Canvas> 
+0

La respuesta de Creynders es más simple, y también funciona. –

3

Utilice la clase DataGridListData, que se pasa al renderer. Contiene una propiedad de campo de datos.

Estoy bastante seguro de que esto debería funcionar:

<mx:Label text="{data[listData.dataField]}" /> 
+0

Esto no compilará: "1120: Acceso de propiedad no definida listData" . Probablemente sea una solución flex2, pero estoy usando Flex3 –

+2

Como descubriste, esto no tiene nada que ver con Flex 2. Muchas clases ya implementan la interfaz IDropInListItemRenderer. Fuera de contexto; Debería considerar volver a trabajar su itemRenderer para usar menos contenedores. ¿Por qué no usar una etiqueta? ¿Realmente necesitas los 2 contenedores adicionales? – JeffryHouser

+0

En realidad, es solo una parte del renderizador completo, en mi código real realmente necesita los contenedores.Pero tienes razón, el ejemplo utilizado aquí puede ser más pequeño. –

2

Usted no tiene que implementar el IDropInListItemRenderer. Esto es suficiente:

data[ (listData as DataGridListData).dataField ] 

El listData concreto es de tipo DataGridListData, pero la propiedad en sí se escribe a BaseListData, ya que un procesador puede ser utilizado en diversos escenarios. Sin embargo, en este escenario, sabemos que DataGridListData, por lo tanto, simplemente podemos convertirlo para acceder a la propiedad dataField.

+0

Hice mi control más genérico y agregué una verificación de tipo: 'if (listData es DataGridListData) {...}' –

0

Los siguientes obras para una basada Spark procesador de elementos en un MX AdvancedDataGrid:

<?xml version="1.0" encoding="utf-8"?> 
<s:MXAdvancedDataGridItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009" 
            xmlns:s="library://ns.adobe.com/flex/spark" 
            xmlns:mx="library://ns.adobe.com/flex/mx" 
            width="100%" 
            > 
    <fx:Declarations> 
     <!-- Place non-visual elements (e.g., services, value objects) here --> 
    </fx:Declarations> 
    <fx:Script> 
     <![CDATA[    
      import mx.controls.dataGridClasses.DataGridListData; 

      override public function set data(value:Object):void {    
       var latency:Number = value[ (this.listData as DataGridListData).dataField] as Number; 

       lbl.text = Utils.formatLatency(latency); 
       if(latency > 1000000) { // 1s => error 
        lbl.setStyle("backgroundColor", 0xFF8080); 
       } else if(latency > 100000) { // 100ms => warning 
        lbl.setStyle("backgroundColor", 0xFFFF80); 
       } else if(latency > 0){ // low latency 
        lbl.setStyle("backgroundColor", 0x80FF80); 
       } 
      } 
     ]]> 
    </fx:Script> 
    <s:Label id="lbl" width="100%" height="100%" verticalAlign="middle" textAlign="right" paddingRight="5"/> 
</s:MXAdvancedDataGridItemRenderer> 
0

aún más simple: sólo tiene que utilizar las propiedades

  • advancedDataGridListData en MXAdvancedDataGridItemRenderers
  • dataGridListData en MXDataGridItemRenderer

    para acceder a esa información.

0

Para una GridItemRenderer promedio Es un

column.dataField 

Así, en su caso esto debería funcionar:

<s:Label text="{data[column.dataField]}" /> 
Cuestiones relacionadas