Flex / AS3:通过refenced属性进行数据绑定

时间:2011-06-08 13:12:20

标签: flex actionscript-3 data-binding

我有:

A类:具有属性“data:ArrayCollection”。它是我的数据源(数据提供者)并具有位图。

类B:有一个A实例(称为“Ainst”)并调用以下方法:C.init(Ainst.data)。将数据提供程序传递给Object C。

类C:具有数据提供者“数据”的引用(因为“init”方法)。它将arrayCollection显示为Images:Image.source = data.getItemAt(0)。

但C永远不会更新其图像,也就是说,数据绑定不适用于此方案。我把[Bindable]元标记放在所有属性甚至类中。

A类:

public class A{ [Bindable]public var data:ArrayCollection; }

B级:

public class B{ [Bindable]public var Ainst:A; public var Cinst:C; public function init(){ Cinst = new C(); Cinst.init(A.data) } }

C类:包含3个项目(位图)的图像菜单

            <s:VGroup xmlns:fx="http://ns.adobe.com/mxml/2009" 
                  xmlns:s="library://ns.adobe.com/flex/spark" 
                  xmlns:mx="library://ns.adobe.com/flex/mx" xmlns:local="*"
                  horizontalAlign="center"
                  paddingTop="10"
                  paddingBottom="10"
                  gap="10">


            <fx:Script>
                    <![CDATA[ 
    [Bindable] public var _images:ArrayCollection; 
    public function init( images:ArrayCollection ):void{

                    _images = images;
}   
        ]]>
            </fx:Script>
            <ms:Image id="PreviousButton" smoothBitmapContent="true" width="55" height="55" source="@Embed(source='/../figures/upArrow.png')"/>
                <ms:Image id="TopItem" smoothBitmapContent="true" maintainAspectRatio="true" x="12.5" source="{_images.getItemAt(0)}" />
                <ms:Image id="MiddleItem" smoothBitmapContent="true" maintainAspectRatio="true" x="12.5" source="{_images.getItemAt(1)}"/>
                <ms:Image id="BottomItem" smoothBitmapContent="true" maintainAspectRatio="true" x="12.5" source="{_images.getItemAt(3)}"/><!-- getItemAt(2).image -->
                <ms:Image id="NextButton" smoothBitmapContent="true" width="55" height="55" source="@Embed(source='/../figures/downArrow.png')"/>
            </s:VGroup>

有什么想法?谢谢。

2 个答案:

答案 0 :(得分:1)

你的问题是函数getItemAt(_images.getItemAt(0))是不可绑定的。

答案 1 :(得分:0)

查看您的课程A

public class A{
    [Bindable]
    public var data:ArrayCollection;
}

此处的属性data不是静态的。所以它与A的实例相关,但与A本身无关。现在看一下B的构造函数:

public function init(){ 
    Cinst = new C(); 
    Cinst.init(A.data);
}

及其现场声明:

[Bindable]
public var Ainst:A;

正如你在一行中看到的那样

Cinst.init(A.data);

您将data称为静态属性。你应该使用:

public function init(){ 
    Cinst = new C(); 
    Cinst.init(Ainst.data);
}

代替。

请保留ActionScript naming and coding conventions。将语句放在单独的行中,并使用小写字母开始标识符。它可以让您更轻松地阅读代码。