2010-08-20 4 views
5

Ich versuche, das DataField einer DataGridColumn im itemRenderer zu erreichen. Unterhalb der Datagrid:Flex 3: Wie bekomme ich das DataField der DataGridColumn in seinem 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> 

Und das ist mein 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> 

In der eingestellten Daten in Abhängigkeit von der itemRenderer, erhalte ich eine ganze Woche (was in Ordnung ist), aber die itemRenderer doesn‘ Ich weiß, welcher Tag zu verwenden ist, weil das Datenfeld unbekannt ist. Kann jemand dieses dataField im itemRenderer erreichen?

Antwort

7

Der Kommentar von www.Flextras.com mir geholfen, die Lösung zu finden. Ich kann zwar verwenden, aber zuerst muss die IDropInListItemRenderer Klasse implementiert werden.

Der letzte 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

Creynders Antwort ist einfacher und funktioniert auch. –

3

Verwenden Sie die Klasse DataGridListData, die an den Renderer übergeben wird. Es enthält eine DataField -Eigenschaft.

Ich bin mir ziemlich sicher, dass dies funktionieren soll:

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

Dies lässt sich nicht kompilieren: "1120: Der Zugang von nicht definierte Eigenschaft listdata" . Es ist wahrscheinlich eine Flex2-Lösung, aber ich verwende Flex3 –

+2

Wie Sie festgestellt haben, hat dies nichts mit Flex 2 zu tun. Viele Klassen implementieren bereits die IDropInListItemRenderer-Schnittstelle. Off-Thema; Sie sollten in Erwägung ziehen, Ihren itemRenderer so zu bearbeiten, dass weniger Container verwendet werden. Warum nicht einfach ein Label verwenden? Brauchen Sie wirklich den Zusatz 2 Behälter? – JeffryHouser

+0

Es ist eigentlich nur ein Teil des gesamten Renderers, in meinem eigentlichen Code braucht es wirklich die Container.Aber du hast recht, das hier verwendete Beispiel kann kleiner sein. –

2

Sie müssen die IDropInListItemRenderer nicht implementieren. Dies ist genug:

data[ (listData as DataGridListData).dataField ] 

Der Beton des Typs listdata Datagridlistdata ist, aber die Eigenschaft selbst ist an Base getippt, da ein Renderer kann in verschiedenen Szenarien verwendet werden. In diesem Szenario ist DataGridListData jedoch bekannt. Daher können wir es einfach für den Zugriff auf die Eigenschaft dataField umwandeln.

+0

Ich habe meine Kontrolle generischer gemacht und eine Typprüfung hinzugefügt: 'if (listData ist DataGridListData) {...}' –

0

Die folgenden Arbeiten für eine Spark-Basis Elementrenderers in einem MX Advanced:

<?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

Noch einfacher: nur die

  • advancedDataGridListData in MXAdvancedDataGridItemRenderers

      Eigenschaften verwenden
    • dataGridListData in MXDataGridItemRenderer

      , um auf diese Informationen zuzugreifen.

  • 0

    Für einen durchschnittlichen GridItemRenderer ist es ein

    column.dataField 
    

    Also, das in Ihrem Fall funktionieren sollte:

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