2011-02-24 36 views
1

我有一個名爲viewBase的視圖組件,其中我定義了一個高級數據網格,併爲datagrid列定義了少量項呈示器。現在我有一個需求,我需要使用相同的視圖viewBase組件,但不需要使用任何項目渲染器。如何爲數據網格組件動態重寫列項呈示器

任何人都可以告訴我如何重寫在視圖組件中聲明的itemrenderer?

+1

我們可以看看代碼嗎? – 2011-02-24 21:03:29

+0

我不明白你在問什麼。代碼可以幫助我們理解。 itemRenderer是DataGrid Column上的一個屬性,因此您可以重寫它以執行其他操作。但是,itemRenderer也可以引用用於創建DataGrid列的組件,在這種情況下,您不會覆蓋它 - 但可以擴展它。 – JeffryHouser 2011-02-24 21:09:50

回答

1

如果你有一個組件ViewBase與AdvancedDataGrid,而你只需要進行動態渲染器之一,你可以做水木清華就像下面的例子(渲染threatLevel是動態的): mx:Script>

 import mx.collections.ArrayCollection; 
     import mx.controls.advancedDataGridClasses.AdvancedDataGridItemRenderer; 
     [Bindable] 
     public var monitoringArrayCollection : ArrayCollection; 
     [Bindable] 
     public var threatRendererClass : Class = AdvancedDataGridItemRenderer; 

/mx:Script>

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

}