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?
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>
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]}" />
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.
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>
Even simpler: just use the properties
advancedDataGridListData
in MXAdvancedDataGridItemRenderersdataGridListData
in MXDataGridItemRendererto access that information.
For an average GridItemRenderer it's a
column.dataField
So, in your case this should work:
<s:Label text="{data[column.dataField]}" />
精彩评论