我可能在这里滥用可绑定变量,所以在我尝试解释我想要的内容时请在这里忍受。
我有一个简单的火花列表,我允许人们通过点击其中一个项目来选择背景。选择背景后,我将其保存到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的属性,如果我的共享对象的值与“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”方法,这将应用所有逻辑来知道哪个是选定的背景,因为变量与我的火花列表绑定,我希望会更新列表。事情是,它没有。
我在这里做错了什么?我是否会完全疯狂,而且这样做更容易,但只有我看不到它?
任何帮助都将不胜感激。
提前致谢
答案 0 :(得分: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();
}
//使用渲染器上的提交属性而不是init
//只要有数据提供者更新/更改
<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>