Вопрос по привязываемым переменным в AS3 - PullRequest
0 голосов
/ 21 сентября 2011

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

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

Этот список заполняется коллекцией ArrayCollection (переменная), созданной следующим образом:

[Bindable] private var arrBG:ArrayCollection = new ArrayCollection();

Затем заполняется следующим образом:

var objImage:Object;
var strSharedObjImage:String = sharedObj.sharedBackground.data.backgroundIndex;
// Background
objImage = new Object();
objImage.icon = ICONS_PATH + objImage.label;
objImage.label = "Titanium";
objImage.selected = (strSharedObjImage == objImage.fileName) ? true : false;
arrBG.addItem(objImage);

objImage = new Object();
objImage.icon = ICONS_PATH + objImage.fileName;
objImage.label = "Iron";
objImage.selected = (strSharedObjImage == objImage.label) ? true : false;
arrBG.addItem(objImage);

Затем я использую его в качестве dataProvider в моем списке искр.

Если вы заметили выше, на моем объектеУ меня есть свойство selected, которое будет установлено в true, если значение моего общего объекта совпадает со значением в свойстве label.

В средстве визуализации элементов для моего списка искр яиметь следующее:

<s:ItemRenderer name="HorizontalListSkin"
                xmlns:fx="http://ns.adobe.com/mxml/2009"
                xmlns:s="library://ns.adobe.com/flex/spark"
                autoDrawBackground="false" 
                creationComplete="initMenuSkin(event)"
                >

    <fx:Script>
        <![CDATA[
        protected function initMenuSkin(event:Event):void
        {

            iconImage.source = data.icon;
            iconText.text = data.label;

            // Check to see if the item we're displying is selected. If it is make it stand out
            if(data.selected){
                iconText.setStyle("color", "Green")
            }
        }

        ]]>
    </fx:Script>

    <s:VGroup x="10" y="10" width="50" height="50" buttonMode="true" horizontalAlign="center">
        <s:Image id="iconImage" horizontalCenter="0"/>
        <s:Label id="iconText" fontFamily="Verdana" fontSize="11" fontWeight="bold" horizontalCenter="0" showTruncationTip="false"/>
    </s:VGroup> 

</s:ItemRenderer>

Итак, как вы можете видеть, я просто меняю цвет шрифта на выбранном элементе.

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

Очевидно, что здесь есть большой пробел, поскольку в моем объяснении нигдевыше яупомяните об обновлении моей привязываемой переменной, чтобы теоретически она распространялась в мой список искр (будучи привязываемой переменной, я бы подумал, что она будет одновременно обновлять элемент в моем списке (?)).делает это несколькими различными способами, и отладчик «говорит», что мой массив обновлен, однако мой список вообще не обновляется, и только другой элемент, отмеченный зеленым, будет отображаться, только если я закрою экран и снова открою(когда все это перезагружается)

Вся логика, описанная выше для создания нового фона, содержится в функции, поэтому всякий раз, когда я выбираю элемент из списка фонов, я снова запускаю свой метод loadBackgrounds,который будет применять всю логику, чтобы узнать, какой фон выбран, и поскольку переменная связана с моим списком искр, я надеялся, что обновит список.Дело в том, что это не так.

Что я здесь не так делаю?Я полностью схожу с ума, и есть намного более простой способ сделать это, но только я не вижу этого?

Любая помощь здесь будет оценена.

Заранее спасибо

1 Ответ

1 голос
/ 21 сентября 2011

После того, как вы настроили сбор данных, вам необходимо обновить его.

arrBG.refresh();

[EDIT]
Хорошо, я перечитал ваш вопрос.
Я думаю, что я неправильно понял, что вы спрашивали.
Вы хотите знать, как обновить список, чтобы средство визуализации элементов повторно отображало новый список после внесения изменений в поставщик данных?

function newSelection( val:String ):void{
  for each( var item:Object in arrBG ){
    if( item.label == val ){
      item.selected = true;
    }else{
      item.selected = false;
    }
  }
  arrBG.refresh();
}

// использовать свойства коммитов в вашем рендерере, а не в инициализации
// свойства фиксации будут срабатывать при каждом обновлении / изменении поставщика данных

<s:ItemRenderer name="HorizontalListSkin"
                xmlns:fx="http://ns.adobe.com/mxml/2009"
                xmlns:s="library://ns.adobe.com/flex/spark"
                autoDrawBackground="false" 
                >

    <fx:Script>
        <![CDATA[
        override protected function commitProperties():void{
            super.commitProperties();
            iconImage.source = data.icon;
            iconText.text = data.label;

            // Check to see if the item we're displying is selected. If it is make it stand out
            if(data.selected){
                iconText.setStyle("color", "Green")
            }
        }

        ]]>
    </fx:Script>

    <s:VGroup x="10" y="10" width="50" height="50" buttonMode="true" horizontalAlign="center">
        <s:Image id="iconImage" horizontalCenter="0"/>
        <s:Label id="iconText" fontFamily="Verdana" fontSize="11" fontWeight="bold" horizontalCenter="0" showTruncationTip="false"/>
    </s:VGroup> 

</s:ItemRenderer>
...