2011-09-21 29 views
0

我可能在这里滥用了可绑定变量,所以请在我尝试解释我想要解释的内容时,请在这里忍受。关于AS3中可绑定变量的问题

我有一个简单的火花列表,允许人们通过点击其中一个项目来选择背景。选择背景后,我将其保存到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); 

然后我把它作为数据提供程序上的我火花表。

如果您注意到上面,我的对象上有一个名为selected的属性,如果我的共享对象的值与“label”属性中的值相同,则该属性将设置为true。

在项目渲染我的火花名单,我有以下几点:

<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

设置数据集合后,您需要刷新它。

arrBG.refresh(); 

[编辑]
好吧,我重新阅读你的问题。
我想我误解了你在问什么。
您想知道如何更新列表,以便在您对数据提供者进行更改后,项呈示器将重新呈现新列表?

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> 
+0

出于某种原因,闪烁的列表,使其以随机方式返回项目。似乎只在我使用项目渲染器时以随机方式返回项目。所以我也在这里添加代码。 –

+0

好吧,我想我明白你现在要问什么,并且已经更新了我的回复 –

+0

今晚会检查一下并回复给你,但是对于我的问题听起来很震撼。今天晚些时候会回复你。欢呼 –