这个功能实现起来不是那么容易。当然,要为DataGrid动态添加列很简单:只要知道所有要添加的列,生成一堆DataGridColumn再放到一个数组里就好了。但问题是,DataGridColumn只能简单的指定一个itemRenderer,那么这个itemRenderer如何知道自己应该属于哪一列呢?
答案在于itemRenderer这个属性的类型。它不是一个简单的数据,而是一个要求实现了IFactory接口的对象。Flex中实现IFactory接口的基本类型是ClassFactory,ClassFactory有一个特殊属性properties,只要设置了它,就会在创建实例的时候自动附加到新实例中对应的属性值。
明白了这一点,问题就迎刃而解了。完整的实现代码如下:
}
代码比较长,不过大部分只是简单的数据整理,重要的只有动态生成ClassFactory的部分:
var cf: ClassFactory = new ClassFactory(MatrixItemRenderer);
cf.properties = { dataField: col.dataField };
col.itemRenderer = cf;
cf.properties = { dataField: col.dataField };
col.itemRenderer = cf;
以及itemRenderer中获取对应列的部分:
public override function set data(value: Object): void
{
super.data = value;
if (dataField != null && dataField in value)
{
var fieldValue: Boolean = Boolean(value[dataField]);
_chk.selected = fieldValue;
}
}
public var dataField: String;
{
super.data = value;
if (dataField != null && dataField in value)
{
var fieldValue: Boolean = Boolean(value[dataField]);
_chk.selected = fieldValue;
}
}
public var dataField: String;