我有一个在列上使用dataGrid的labelFunction。这会将dataField更改为不同的值。
我在同一列上有一个sortCompareFunction。但是,sortCompareFunction只使用底层数据项值。
我知道我可以从labelFunction内部调用sortCompareFunction,在进行比较之前更改值,但我要做的是:将显示的值从列传递给sortCompareFunction。这有可能吗。
下面的一些示例代码来表示问题(如果您复制和过去到一个新的Flex 3应用程序,则可以工作)
在图像中,值"AAAAA“后面的数据是”墙“,所以在进行排序时,它出现在中间,我希望访问"AAAA”值:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical"
initialize="init()">
<mx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
import mx.controls.dataGridClasses.DataGridColumn;
import mx.utils.ObjectUtil;
[Bindable]
private var albums:ArrayCollection;
private function init():void
{
var album:Object;
albums = new ArrayCollection();
album = new Object();
album.name = "Who's Next";
album.artist = "The Who";
album.date = "Jul 31 1971";
albums.addItem(album);
album = new Object();
album.name = "Exile on Main St.";
album.artist = "The Rolling Stones";
album.date = "May 12 1972";
albums.addItem(album);
album = new Object();
album.name = "The Wall";
album.artist = "Pink Floyd";
album.date = "Dec 8 1979";
albums.addItem(album);
}
private function nameLabelFunction(inData:Object, inColumn:DataGridColumn):String
{
if(inData.name == "The Wall")
{
return "AAAA"
}
else
return inData.name;
}
private function nameSortCompare(obj1:Object, obj2:Object):int
{
return ObjectUtil.stringCompare(obj1["name"], obj2["name"], true);
}
]]>
</mx:Script>
<mx:DataGrid width="400" height="600" dataProvider="{albums}">
<mx:columns>
<mx:DataGridColumn dataField="name" headerText="Name" width="125"
labelFunction="nameLabelFunction"
sortCompareFunction="nameSortCompare"/>
<mx:DataGridColumn dataField="artist" headerText="Artist" width="125" />
<mx:DataGridColumn dataField="date" headerText="Date" width="100" />
</mx:columns>
</mx:DataGrid>
</mx:Application>发布于 2013-01-30 16:49:31
我们能用点小把戏吗?
private function nameLabelFunction(inData:Object, inColumn:DataGridColumn):String
{
if(inData.name == "The Wall")
{
inData.realLabel = 'AAAA';
return "AAAA"
}
else
{
inData.realLabel = inData.name;
return inData.name;
}
}
private function nameSortCompare(obj1:Object, obj2:Object):int
{
return ObjectUtil.stringCompare(obj1["realLabel"], obj2["realLabel"], true);
}

//编辑
使用labelFunction本身的另一种方法
可以使用该函数计算要比较的值。
假设f是类函数的一个对象,那么
f.call(dg.columns[0], obj1, dg.columns[0])给出datagrid字段的实际标签。
//this function should not be changed
private function nameLabelFunction(inData:Object, inColumn:DataGridColumn):String
{
if(inData.name == "The Wall")
return "AAAA"
else
return inData.name;
}
//the actual comparison looks now like this:
private function nameSortCompare(obj1:Object, obj2:Object):int
{
var f:Function = (dg.columns[0] as DataGridColumn).labelFunction;
return ObjectUtil.stringCompare(f.call(dg.columns[0], obj1, dg.columns[0]), f.call(dg.columns[0], obj2, dg.columns[0]), true);
}https://stackoverflow.com/questions/14608204
复制相似问题