Flex - 发送一个参数给一个自定义的ItemRenderer?

问题描述:

我试图完成的任务是让我的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不存在)

因此,没有人知道我怎么会去实现呢?

你可能想看看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

啊,所以我知道的是outerDocument而不是parentDocument。我能够使用parentDocument。*,无论我想从主应用程序中获得什么,只要它是公开的,我就可以访问它。

例子:

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

甜! :)

+0

使用parentDocument会将项目渲染器耦合到父组件,并使其无法在应用程序的其他任何位置使用。小心翼翼地,这通常被认为是不好的做法。 – 2009-02-09 23:33:09

如果需要,可以通过使用静态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,以确保侦听器分配不会无意中干扰垃圾回收。希望能帮助到你!

我喜欢覆盖项目渲染器的数据集功能更改呈现当如图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

尼斯的ClassFactory实例here

还有另一种技术,其中,尽管它最初感觉有点冒险,但在实际使用中可能不那么麻烦和干净。

它涉及的事件调度当然是同步的,并且事件对象可以被视为任何事件处理程序填充的值对象。

即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 - 我只是懒惰的说明目的。

我投了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

您使用outerDocument属性。请参阅the fx:Component reference

您可以在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相同的值,但它看起来像这可能是你在做什么无论如何。

见下面的例子:

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