0

頻繁に変更される一連の Number 変数を持つモデル クラスがあります。それらはすべてカスタム イベントをディスパッチするため、バインド可能です。

私の UI では、これらのクラス インスタンスのいくつかが、Spark DataGrid のデータ プロバイダーとして機能する ArrayList にバンドルされています。クラス変数は完全に問題なく変更されるため、問題があります。

私が今やりたいことは、入ってくるデータに応じてこれらの数値の色の書式設定を変更することです (正確には gridcoloums の対応するラベル)。新しい値が古い値よりも小さい場合は赤色になります。

どうすればこれを機能させることができますか?古い値のある種のキャッシュについて考えてから、古い値と新しい値を比較します。これはこれを行う方法ですか?もしそうなら、どのように? または、何かをキャッシュする必要のない、おそらくもっと簡単な方法がありますか?

どんな助けでも大歓迎です!

編集: @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 プロパティの使用とは対照的です) が、複数のグリッド列に対してこのアイテム レンダラーを使用すると、各グリッド列に同じ値が使用されます。それは何についてですか?

編集:申し訳ありませんが、これは私ができない data.property などのモデルのプロパティに直接対処する場合にのみ機能します。すべての列に一般的なアイテム レンダラーが必要です。

4

2 に答える 2

1

その方法は、カスタム アイテム レンダラーです。アイテム レンダラーには、データ プロバイダーが DataGrid で変更されたときに設定されるdataプロパティ (はデータ プロバイダーからの単一の値)が付属しています。dataあなたはしたいでしょう

  1. previousDataタイプの新しいプライベート変数を追加しObject
  2. dataアイテム レンダラーのセッターをオーバーライドします。

のセッターは次のdataようになります。

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 に答える
1

データ グリッド用のカスタム アイテム レンダラーを作成する必要があると思います。dataそこで、セッターをオーバーライドし、BindingUtilsフィールドの変更を処理するために使用する必要があります。使用例はこちら

または、アイテム レンダラーで次の方法でデータを再割り当てできます。

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

[Bindable]
private var myModelInstance:MyModelClass;

myModelInstance次に、MXML アイテム レンダラーのフィールドにバインドします。

于 2012-01-05T13:58:27.423 に答える