23

我想要完成的工作是让我的 Flex Datagrid 中的财务数据进行颜色编码——如果是肯定的,则为绿色;如果是负数,则为红色。如果我想要着色的列是 dataProvider 的一部分,这将相当简单。相反,我是根据作为 dataProvider 一部分的另外两列来计算它的。这仍然相当简单,因为我可以在 ItemRenderer 中再次计算它,但计算的另一部分是基于文本框的值。所以,我认为我需要能够将文本框的值发送到自定义 ItemRenderer,但由于该值存储在主 MXML 应用程序中,我不知道如何访问它。将其作为参数发送似乎是最好的方法,但也许还有另一种方法。

这是我的 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 不存在)

那么有谁知道我将如何实现这一目标?

4

10 回答 10

35

您可能想从 Flex API中查看ClassFactory :

这允许您设置具有任意类型/值的原型对象,每个类型/值都将传递给项目渲染器。从样本中:

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

上面的代码假定“ProductRenderer”有一个名为“showProductImage”的公共属性,该属性将设置为“true”。

于 2009-02-09T17:20:11.213 回答
1

啊,所以我知道outerDocument,但不知道parentDocument。我可以从主应用程序中使用 parentDocument.*任何我想要的东西,只要它是公开的,我就可以访问它。

例子:

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

甜的!:)

于 2009-02-09T18:30:53.477 回答
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 属性发生变化时,每个 item-renderer 对象都会收到通知,您可以根据当时控件的值采取适当的操作。另请注意,在这种情况下,我已将useWeakReference参数设置为 true,以确保侦听器分配不会无意中干扰垃圾收集。希望能帮助到你!

于 2009-02-09T18:31:39.857 回答
0

我喜欢重写项目渲染器的设置数据功能,以在数据提供者更改时更改渲染器,如下所示

当您覆盖该函数时,您可以将对象强制转换为您的对象以使 availableFunding 属性可用。

要访问文本框,您可以尝试创建一个公共属性并将该属性绑定到 mxml 文件中的文本框:

public var textVar:String;

            <mx:itemRenderer>
                <mx:Component>
                    <customrenderer textVar="{txtBox.text}" />
                </mx:Component>
            </mx:itemRenderer>
于 2009-02-09T22:25:11.230 回答
0

不错的 ClassFactory 示例在这里

于 2010-01-05T05:01:57.120 回答
0

还有另一种技术,虽然它最初感觉有点hacky,但在实际使用中可能不那么麻烦和清洁。

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

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

于 2012-02-15T17:59:49.147 回答
0

我投票赞成悬崖。迈耶斯的回答

下面是另一个示例,它通过构建一个函数来从 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

于 2012-08-03T09:30:37.470 回答
0

你使用outerDocument财产。请参阅fx:Component参考资料

于 2012-09-08T11:10:45.300 回答
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 的值都相同,但看起来这可能就是你正在做的事情。

于 2013-01-06T05:38:00.803 回答
0

看这个例子:

itemRenderer="{UIUtils.createRenderer(TextBox,{iconSrc:IconRepository.linechart,headerColor:0xB7D034,subHeaderColor:0xE3007F,textColor:0x75757D})}"
                                   
于 2015-12-02T16:41:11.250 回答