Maurits de Boer
Maurits de Boer

Reputation: 1957

Flex 3: How do I get the DataGridColumn's dataField in its ItemRenderer?

I'm trying to reach the dataField of a DataGridColumn in the itemRenderer. Below is the dataGrid:

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

And this is my 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 the set data function of the itemRenderer, I receive an entire week (which is ok), but the itemRenderer doesn't know which day to use because the dataField is unknown. Does anyone know how to reach this dataField in the itemRenderer?

Upvotes: 5

Views: 19712

Answers (6)

Maurits de Boer
Maurits de Boer

Reputation: 1957

The comment by www.Flextras.com helped me to find the solution. I can indeed use listData.dataField, but first the IDropInListItemRenderer class needs to be implemented.

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

Upvotes: 7

UnknownJoe
UnknownJoe

Reputation: 599

For an average GridItemRenderer it's a

column.dataField

So, in your case this should work:

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

Upvotes: 0

JorisT
JorisT

Reputation: 1552

Even simpler: just use the properties

  • advancedDataGridListData in MXAdvancedDataGridItemRenderers

  • dataGridListDatain MXDataGridItemRenderer

    to access that information.

Upvotes: 0

MonoThreaded
MonoThreaded

Reputation: 12033

The following works for a Spark based item renderer in a 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>

Upvotes: 0

Creynders
Creynders

Reputation: 4583

You don't have to implement the IDropInListItemRenderer. This is enough:

data[ ( listData as DataGridListData ).dataField ]

The concrete listData is of type DataGridListData, but the property itself is typed to BaseListData, since a renderer can be used in various scenarios. However, in this scenario we know it's DataGridListData, therefore we can simply cast it to access the dataField property.

Upvotes: 2

JeffryHouser
JeffryHouser

Reputation: 39408

Use the DataGridListData class, which is passed into the renderer. It contains a dataField property.

I'm pretty sure this should work:

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

Upvotes: 3

Related Questions