Подтвердить что ты не робот

Flex. Отправка параметра в пользовательский ItemRenderer?

То, что я пытаюсь сделать, чтобы получить финансовые данные в моем 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 не существует)

Знает ли кто-нибудь, как я мог бы это сделать?

4b9b3361

Ответ 1

Вы можете посмотреть ClassFactory из API Flex:

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

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

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

Ответ 2

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

Пример:

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

Сладкое!:)

Ответ 3

Вы можете получить доступ к значению 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, чтобы удостовериться, что назначения слушателя не мешают непреднамеренно с помощью сборки мусора. Надеюсь, это поможет!

Ответ 4

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

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

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

public var textVar:String;

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

Ответ 5

Пример Nice ClassFactory здесь

Ответ 6

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

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

то есть. 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 - я просто использую это для ленивых иллюстративных целей.

Ответ 7

Я проголосую за ответ 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

Ответ 9

Вы можете создать статическую переменную "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, но похоже, что это может быть то, что вы делаете в любом случае.

Ответ 10

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

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