如果您有一个带有 AdvancedDataGrid 的组件 ViewBase,您需要使其成为动态的渲染器之一,您可以像下面的示例中那样进行操作(threatLevel 的渲染器是动态的):
mx:Script>
import mx.collections.ArrayCollection;
import mx.controls.advancedDataGridClasses.AdvancedDataGridItemRenderer;
[Bindable]
public var monitoringArrayCollection : ArrayCollection;
[Bindable]
public var threatRendererClass : Class = AdvancedDataGridItemRenderer;
/mx:脚本>
<mx:AdvancedDataGrid dataProvider="{monitoringArrayCollection}">
<mx:columns>
<mx:AdvancedDataGridColumn dataField="firstName" />
<mx:AdvancedDataGridColumn dataField="lastName" />
<mx:AdvancedDataGridColumn dataField="threatLevel" itemRenderer="{new ClassFactory(threatRendererClass)}" />
</mx:columns>
</mx:AdvancedDataGrid>
那么,不同渲染器的组件使用示例如下:
<mx:VBox>
<components:ViewBase />
<components:ViewBase threatRendererClass="{ThreatRenderer}" />
</mx:VBox>
其中ThreatRenderer是自定义渲染器,例如:
public class ThreatRenderer extends UIComponent implements IDataRenderer, IListItemRenderer
{
private var _data : Object;
private var _dataChanged : Boolean = false;
public function get data():Object
{
return _data;
}
public function set data(value:Object):void
{
_data = value;
_dataChanged = true;
invalidateDisplayList();
}
protected override function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void
{
super.updateDisplayList(unscaledWidth, unscaledHeight);
if (!_dataChanged || !data) return;
var g : Graphics = this.graphics;
g.clear();
g.beginFill(0xFF0000, 1);
g.drawRect(0, 0, unscaledWidth*Number(data.threatLevel)/100, unscaledHeight);
_dataChanged = false;
}
}