2009-02-09 50 views
23

我試圖完成的任務是讓我的Flex Datagrid中的財務數據進行顏色編碼 - 如果是正數,則爲綠色;紅色,如果它是負面的。如果我想着色的列是dataProvider的一部分,這將是相當簡單的。相反,我正在計算它基於dataProvider的一部分的另外兩列。這仍然是相當直接的,因爲我可以在ItemRenderer中再次計算它,但計算的另一部分是基於文本框的值。所以,我認爲我需要做的就是將textBox的值發送到自定義的ItemRenderer,但由於該值存儲在主MXML應用程序中,所以我不知道如何訪問它。發送它作爲參數似乎是最好的方式,但也許還有另一個。Flex - 發送一個參數給一個自定義的ItemRenderer?

這裏是我的ItemRenderer當前代碼:

package { 
import mx.controls.Label; 
import mx.controls.listClasses.*; 

public class PriceLabel extends Label { 
    private const POSITIVE_COLOR:uint = 0x458B00 // Green 
    private const NEGATIVE_COLOR:uint = 0xFF0000; // Red 

    override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void { 
     super.updateDisplayList(unscaledWidth, unscaledHeight); 

     /* Set the font color based on the item price. */ 
     setStyle("color", (data.AvailableFunding >= 0) ? NEGATIVE_COLOR : POSITIVE_COLOR); 
    } 
} 

(data.AvailableFunding不存在)

因此,沒有人知道我怎麼會去實現呢?

回答

35

你可能想看看ClassFactory從Flex的API:

這使您可以設置任意類型/值每個將被傳遞到項目渲染器的原型對象。從樣本:

var productRenderer:ClassFactory = new ClassFactory(ProductRenderer); 
productRenderer.properties = { showProductImage: true }; 
myList.itemRenderer = productRenderer; 

上面的代碼假定「ProductRenderer」有一個名爲「showProductImage」這將值設置一個公共財產「真」。

+4

更好的答案比選擇的一個!添加一個事件處理程序,編寫三行代碼...完成! – 2011-03-17 21:35:19

+1

你能舉一個例子來說明如何做到這一點嗎?我有一個列表組件和一個itemrenderer,我想傳遞一個額外的值到itemrenderer中,我該怎麼做? – sstauross 2012-03-13 18:06:40

+1

非常優雅,創造奇蹟。爲了清楚起見,只需在渲染中定義屬性(例如fx:Declaration) – MonoThreaded 2012-06-22 15:22:52

1

啊,所以我知道的是outerDocument而不是parentDocument。我能夠使用parentDocument。*,無論我想從主應用程序中獲得什麼,只要它是公開的,我就可以訪問它。

例子:

setStyle("color", (parentDocument.availableFunding >= 0) ? POSITIVE_COLOR : NEGATIVE_COLOR); 

甜! :)

+0

使用parentDocument會將項目渲染器耦合到父組件,並使其無法在應用程序的其他任何位置使用。小心翼翼地,這通常被認爲是不好的做法。 – 2009-02-09 23:33:09

1

如果需要,可以通過使用靜態Application.application對象直接訪問TextBox的值,該對象可在應用程序的任何位置訪問。例如,如果希望在TextInput控件的值發生更改時通知呈示器,則可以執行此類操作(從您的ItemRenderer中進行操作,其中myTextInput是在主MXML中定義的控件的ID)類):

<mx:Script> 
    <![CDATA[ 

     import mx.core.Application; 

     private function creationCompleteHandler(event:Event):void 
     { 
      Application.application.myTextInput.addEventListener(TextEvent.TEXT_INPUT, handleTextInput, false, 0, true); 
     } 

     private function handleTextInput(event:TextEvent):void 
     { 
      if (event.currentTarget.text == "some special value") 
      { 
       // Take some action... 
      } 
     } 

    ]]> 
</mx:Script> 

用這種方法,每一個項目,渲染對象將會收到通知時,將TextInput的text屬性的變化,您可以根據當時的控件的值採取適當的行動。另外請注意,在這種情況下,我已將useWeakReference參數設置爲true,以確保偵聽器分配不會無意中干擾垃圾回收。希望能幫助到你!

0

我喜歡覆蓋項目渲染器的數據集功能更改呈現當如圖here

當你重寫你可以把對象到對象的功能,使數據提供商變化提供可用的財產。

要訪問的文本框,你可以嘗試創建一個公共財產和綁定屬性設置爲文本框在MXML文件:

public var textVar:String; 

      <mx:itemRenderer> 
       <mx:Component> 
        <customrenderer textVar="{txtBox.text}" /> 
       </mx:Component> 
      </mx:itemRenderer> 
+0

這不起作用。聲明的mx:Component超出了txtBox.text所在的範圍。 – Nek 2010-12-20 14:54:04

0

還有另一種技術,其中,儘管它最初感覺有點冒險,但在實際使用中可能不那麼麻煩和乾淨。

它涉及的事件調度當然是同步的,並且事件對象可以被視爲任何事件處理程序填充的值對象。

即ItemRenderer的可以這樣做:

... 
    var questionEvt:DynamicEvent = new DynamicEvent('answerMeThis', true, true); 
    if (dispatchEvent(questionEvt)) 
    { 
     if (questionEvent.answer == "some value") 
     .... 

與相應的處理程序的地方了是對事件的監聽器,並做一些事情,如呈現器上面的視圖層次:

function handleAnswerMeThis(event:DynamicEvent):void 
{ 
    event.answer = "another value"; 
    event.dataHelper = new DataHelperThingy(); 
} 

等等。

它不一定是一個DynamicEvent - 我只是懶惰的說明目的。

0

我投了cliff.meyers' answer

下面是關於通過構建一個函數來設置MXML中的itemRenderer屬性的另一個示例,該函數將classFactory包裝在itemRenderer類的周圍並注入必要的屬性。

靜態函數:

public static function createRendererWithProperties(renderer:Class, 
properties:Object):IFactory { 
    var factory:ClassFactory = new ClassFactory(renderer); 
    factory.properties = properties; 
    return factory; 
} 

一個簡單的例子,增加了一個工具提示,以每個項目的列表:

<mx:List dataProvider="{['Foo', 'Bar']}" itemRenderer="{createRendererWithProperties(Label, {toolTip: 'Hello'})}"/> 

參考:
http://cookbooks.adobe.com/post_Setting_the_properties_of_an_itemRenderer_from_MXM-5762.html

0

您可以在ItemRenderer中創建一個'AvailableFunding'靜態變量,然後將其設置在父文檔中。

public class PriceLabel extends Label { 
    public static var availableFunding:int; 
    ... 
    ... 
    SetStyle("color", (PriceLabel.availableFunding >= 0) ? NEGATIVE_COLOR : POSITIVE_COLOR); 
} 

在父文件中,設置當你的文本框中獲取更新

PriceLabel.availableFunding = textBox.text; 

顯然,這將是每一個的ItemRenderer相同的值,但它看起來像這可能是你在做什麼無論如何。

0

見下面的例子:

的itemRenderer = 「{UIUtils.createRenderer(文本框,{iconSrc:IconRepository.linechart,headerColor:0xB7D034,subHeaderColor:0xE3007F,文字顏色:0x75757D})}」