web-dev-qa-db-ja.com

Flex-カスタムItemRendererにパラメーターを送信しますか?

Flex Datagridの財務データを色分けするために達成しようとしていること。正の場合は緑色。負の場合は赤。色を付けたい列がdataProviderの一部である場合、これはかなり簡単です。代わりに、dataProviderの一部である他の2つの列に基づいて計算しています。 ItemRendererで再度計算できるので、それでもかなり簡単ですが、計算の別の部分はtextBoxの値に基づいています。したがって、私ができる必要があると思うのは、textBoxの値をカスタム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は存在しません)

だから誰かが私がこれを達成する方法を知っていますか?

23
Matt Dell

Flex APIから ClassFactory を調べることをお勧めします。

これにより、それぞれがアイテムレンダラーに渡される任意のタイプ/値でプロトタイプオブジェクトを設定できます。サンプルから:

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

上記のコードは、「ProductRenderer」に「showProductImage」というパブリックプロパティがあり、「true」の値で設定されることを前提としています。

35
cliff.meyers

ああ、私はouterDocumentについては知っていましたが、parentDocumentについては知りませんでした。 parentDocument。*をメインアプリから何でも使用でき、公開されている限りアクセスできます。

例:

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

甘い! :)

1
Matt Dell

必要に応じて、アプリケーションのどこからでもアクセスできる静的なApplication.applicationオブジェクトを使用して、TextBoxの値に直接アクセスできます。

たとえば、TextInputコントロールの値が変更されたときにレンダラーに通知するようにしたい場合は、次のようにすることができます(ItemRenderer内から、myTextInputはメインで定義されたコントロールのIDです。 MXMLクラス):

<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に設定したことにも注意してください。それが役に立てば幸い!

1

別のテクニックがあります。最初は少しハッキーな感じがしますが、実際の使用ではおそらくそれほど面倒でクリーンではありません。

もちろん、イベントディスパッチは同期的であり、イベントオブジェクトは任意のイベントハンドラーによって入力された値オブジェクトとして扱うことができるという、ほとんど観察されていない事実が含まれます。

つまり、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である必要はありません-私はそれを怠惰な説明の目的で使用しています。

0
verveguy

素敵なClassFactoryの例 ここ

0
Satya

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で同じ値になりますが、とにかくそれがあなたがしていることかもしれないように見えます。

0
Robert Cesaric

私は cliff.meyersの答え に投票します。

これは、ItemRendererクラスの周りにClassFactoryをラップし、必要なプロパティを挿入する関数を構築することによって、MXMLから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

0
user4360941

アイテムレンダラーのsetdata関数をオーバーライドして、データプロバイダーが次のように変更されたときにレンダラーを変更するのが好きです ここ

関数をオーバーライドすると、オブジェクトをオブジェクトにキャストして、availableFundingプロパティを使用可能にすることができます。

テキストボックスにアクセスするには、パブリックプロパティを作成し、そのプロパティをmxmlファイルのテキストボックスにバインドしてみます。

public var textVar:String;

            <mx:itemRenderer>
                <mx:Component>
                    <customrenderer textVar="{txtBox.text}" />
                </mx:Component>
            </mx:itemRenderer>
0
Brandon

この例を参照してください。

itemRenderer = "{UIUtils.createRenderer(TextBox、{iconSrc:IconRepository.linechart、headerColor:0xB7D034、subHeaderColor:0xE3007F、textColor:0x75757D})}"

0
Lin W

outerDocumentプロパティを使用します。 fx:Component参照

0
stanios