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”这将值设置一个公共财产“真”。
啊,所以我知道的是outerDocument而不是parentDocument。我能够使用parentDocument。*,无论我想从主应用程序中获得什么,只要它是公开的,我就可以访问它。
例子:
setStyle("color", (parentDocument.availableFunding >= 0) ? POSITIVE_COLOR : NEGATIVE_COLOR);
甜! :)
使用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>
这不起作用。声明的mx:Component超出了txtBox.text所在的范围。 – Nek 2010-12-20 14:54:04
还有另一种技术,其中,尽管它最初感觉有点冒险,但在实际使用中可能不那么麻烦和干净。
它涉及的事件调度当然是同步的,并且事件对象可以被视为任何事件处理程序填充的值对象。
即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 - 我只是懒惰的说明目的。
下面是关于通过构建一个函数来设置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
您可以在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})}”
更好的答案比选择的一个!添加一个事件处理程序,编写三行代码...完成! – 2011-03-17 21:35:19
你能举一个例子来说明如何做到这一点吗?我有一个列表组件和一个itemrenderer,我想传递一个额外的值到itemrenderer中,我该怎么做? – sstauross 2012-03-13 18:06:40
非常优雅,创造奇迹。为了清楚起见,只需在渲染中定义属性(例如fx:Declaration) – MonoThreaded 2012-06-22 15:22:52