Flex - Отправка параметра в пользовательский ItemRenderer? - PullRequest
23 голосов
/ 09 февраля 2009

Что я пытаюсь сделать, чтобы финансовые данные в моем Flex Datagrid имели цветовую кодировку - зеленый, если он положительный; красный, если он отрицательный. Это было бы довольно просто, если бы столбец, который я хочу раскрасить, был частью dataProvider. Вместо этого я рассчитываю его на основе двух других столбцов, которые являются частью dataProvider. Это было бы все еще довольно просто, потому что я мог бы просто вычислить это снова в 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 не существует)

Так кто-нибудь знает, как мне поступить?

Ответы [ 10 ]

35 голосов
/ 09 февраля 2009

Возможно, вы захотите взглянуть на ClassFactory из Flex APIs:

Это позволяет вам установить прототип Object с произвольными типами / значениями, каждое из которых будет передаваться в средство визуализации элементов. Из образца:

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

В приведенном выше коде предполагается, что «ProductRenderer» имеет открытое свойство «showProductImage», для которого будет установлено значение «true».

1 голос
/ 09 февраля 2009

Вы можете получить доступ к значению TextBox напрямую, если вам нужно, используя статический объект Application.application, который доступен из любой точки вашего приложения.

Например, если вы хотите, чтобы средства визуализации были уведомлены при изменении значения элемента управления TextInput, вы можете сделать что-то вроде этого (из вашего ItemRenderer, где myTextInput - это идентификатор элемента управления, определенного в вашем основном Класс 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, и вы можете предпринять соответствующее действие на основе значения элемента управления в это время. Также обратите внимание, что в этом случае я установил для аргумента useWeakReference значение true, чтобы убедиться, что назначения прослушивателей не мешают непреднамеренному сбору мусора. Надеюсь, это поможет!

1 голос
/ 09 февраля 2009

Ах, так что я знал о externalDocument, но не parentDocument. Мне удалось использовать parentDocument. * Все, что я хочу от основного приложения, и я могу получить к нему доступ, если он общедоступен.

Пример:

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

Сладкое! :)

0 голосов
/ 02 декабря 2015

См. Этот пример:

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

0 голосов
/ 06 января 2013

Вы можете создать статическую переменную «AvailableFunding» в ItemRenderer, а затем установить ее в родительском документе.

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 голосов
/ 08 сентября 2012

Вы используете outerDocument свойство. Пожалуйста, смотрите fx:Component ссылку .

0 голосов
/ 03 августа 2012

Я голосую за ответ cliff.meyers .

Вот еще один пример установки свойств itemRenderer из MXML путем создания функции, которая оборачивает 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

0 голосов
/ 15 февраля 2012

Есть еще одна техника, которая, хотя поначалу кажется немного хакерской, возможно, менее громоздка и более чиста в реальном использовании.

Это включает в себя малоизвестный факт, что отправка события, конечно, является синхронной, и объект события может рассматриваться как объект значения, заполняемый любым обработчиком события.

т.е. 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 голосов
/ 05 января 2010

Пример класса ClassFactory здесь

0 голосов
/ 10 февраля 2009

Я хочу переопределить функцию установки данных средства визуализации элементов, чтобы изменить средство визуализации при изменении поставщика данных, как показано здесь

Когда вы переопределяете функцию, вы можете привести объект к вашему объекту, чтобы сделать доступным свойство availableFunding.

Чтобы получить доступ к текстовому полю, вы можете попробовать создать открытое свойство и связать свойство с текстовым полем в файле mxml:

public var textVar:String;

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