0

我有一个模型类,其中包含一堆经常变化的数字变量。他们都调度他们的自定义事件,因此是可绑定的。

在我的 UI 中,其中几个类实例被捆绑到一个 ArrayList 中,该 ArrayList 用作 Spark DataGrid 的数据提供者。类变量变化得很好,所以那里有问题。

我现在想做的是根据传入的数据更改这些数字的颜色格式(确切地说是网格列中的相应标签),也就是说,当新值更大时更改为绿色,更改当新值小于旧值时变为红色。

我怎样才能使这项工作?我想对旧值进行某种缓存,然后比较旧值和新值。这是这样做的方法吗,如果是这样,怎么做?还是有另一种可能更简单的方法而不需要缓存任何东西?

任何帮助将非常感激!

编辑:根据@NoobsArePeople2 给出的示例,这是我当前的代码。首先是数据网格。dataProvider 是一个包含 myModel 类对象的 ArrayList。

<s:DataGrid dataProvider="{_listItems}" >
    <s:columns>
        <s:ArrayList>
        <s:GridColumn dataField="change" headerText="Change" itemRenderer="tableCell">
        <s:GridColumn dataField="bid" headerText="Bid" itemRenderer="tableCell">
  ...
</s:DataGrid>

现在是 tableCell 渲染器;

<s:GridItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009" 
            xmlns:s="library://ns.adobe.com/flex/spark" width="100%" height="100%">

<fx:Script>
    <![CDATA[
        private var previousData:Number;
        private var labelColor:uint;
                    private var _data:Object;

        override public function set data(value:Object):void {

            previousData = _data;
            _data = Number(value);
            invalidateProperties();
        }

        override protected function commitProperties():void {
            super.commitProperties();

            if(previousData < data) {
                labelColor = 0x40c040;
            } else if (previousData > data){
                labelColor = 0xf05050;
            } else
                labelColor = 0xc0c0c0;

            itemLabel.setStyle("color", labelColor);
            itemLabel.text = String(_data); 
        }   
    ]]>
</fx:Script>

<s:Label id="itemLabel"/>
</s:GridItemRenderer>

到目前为止,这工作正常(与使用引发未定义错误的数据属性相反),但是,当将这个项目渲染器用于多个网格列时,它对每个网格列使用相同的值。那是怎么回事?

编辑:对不起,这只有在我直接处理模型的属性时才有效,比如 data.property,这是我做不到的。我需要所有列的通用项目渲染器。

4

2 回答 2

1

我认为您应该为您的数据网格创建自定义项目渲染器。在那里,您应该覆盖datasetter 并用于BindingUtils处理字段更改。示例用法在这里

或者您可以通过以下方式在项目渲染器中重新分配您的数据:

override public function set data(value:Object):void
{
    if (value == data)
        return;
    myModelInstance = MyModelClass(value);
}

[Bindable]
private var myModelInstance:MyModelClass;

然后绑定到myModelInstanceMXML 项目渲染器中的字段。

于 2012-01-05T13:58:27.423 回答
1

要走的路是自定义项目渲染器。项呈现器将附带一个data属性(其中data是来自数据提供者的单个值),当您的数据提供者在 DataGrid 上发生更改时,将为您设置该属性。你会想要

  1. previousData添加一个新的类型的私有变量Object,并且
  2. 覆盖data项目渲染器中的设置器。

你的 setterdata看起来像这样:

override public function set data(value:Object):void
{
    // If the data hat not changed, don't do anything
    if (data == value) return;

    // Take the current data and store it in previousData
    previousData = data;

    // Update the current data to the new value that was passed in
    // BEGIN EDIT
    // data = value; <-- Previous code example is wrong it should be:
    super.data = value;
    // END EDIT

    // Tell Flex to update the properties of this renderer
    invalidateProperties();
}

然后,在您的项目渲染器中,覆盖这样的commitProperties()方法:

override protected function commitProperties():void
{
    super.commitProperties();

    // pseudo code follows
    if (previousData < data)
    {
        labelColor = green;
    }
    else if (previousData > data)
    {
        labelColor = red;
    }
    else
    {
        labelColor = black;
    }

    label.text = data;
    label.color = labelColor;
    // end pseudo code

}

或者,如果您需要访问的属性data并且不想硬编码值,这应该可以工作(注意:我还没有实际测试过这段代码,但它应该可以正常工作)。

override protected function commitProperties():void
{
    super.commitProperties();

    // This assumes your item renderer subclasses [GridItemRenderer][2]
    var dataField:String = column.dataField;
    var previousValue:Object = previousData[dataField];
    var currentValue:Object = data[dataField];

    // pseudo code follows
    if (previousValue < currentValue)
    {
        labelColor = green;
    }
    else if (previousValue > currentValue)
    {
        labelColor = red;
    }
    else
    {
        labelColor = black;
    }

    label.text = data;
    label.color = labelColor;
    // end pseudo code
}
于 2012-01-06T07:43:25.880 回答