Кэширование переменных в провайдере данных - PullRequest
0 голосов
/ 05 января 2012

У меня есть класс модели с кучей числовых переменных, которые часто меняются.Все они отправляют свои пользовательские события, поэтому их можно привязать.

В моем пользовательском интерфейсе пара этих экземпляров класса объединена в ArrayList, который служит поставщиком данных для Spark DataGrid.Переменные класса меняются очень хорошо, поэтому проблема там.

Что я хотел бы сейчас сделать, это изменить цветовое форматирование этих чисел (точнее, соответствующих меток в сетке) в зависимости от данных, которыеприходит, так сказать, зеленый цвет, когда новое значение больше, и красный, если новое значение меньше старого.

Как я могу заставить эту работу работать?Я хоть о каком-то кешировании старого значения и потом сравниваю старое и новое.Это способ сделать это, если да, то как?Или есть другой, возможно, более простой способ без необходимости что-либо кэшировать?

Любая помощь будет принята с благодарностью!

Редактировать: Основано на примере, приведенном @ NoobsArePeople2, это мой текущий код,Сначала DataGrid.DataProvider - это ArrayList, который содержит объекты класса myModel.

<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, что я не могу сделать.Мне нужен общий рендер для всех столбцов.

Ответы [ 2 ]

1 голос
/ 06 января 2012

Способ заключается в рендерере пользовательских элементов. средство визуализации элементов будет иметь свойство data (где data - одно значение от вашего поставщика данных), которое будет установлено для вас при изменении вашего поставщика данных в DataGrid. Вам захочется

  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
}
1 голос
/ 05 января 2012

Я думаю, вы должны создать свой собственный рендерер элементов для вашей сетки данных. Там вы должны переопределить data setter и использовать BindingUtils для обработки изменений поля. Пример использования здесь .

Или вы можете переназначить данные в средстве визуализации следующим образом:

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

[Bindable]
private var myModelInstance:MyModelClass;

А затем привязать к полям myModelInstance в средстве визуализации элементов MXML.

...