绑定到对象属性

时间:2011-11-25 05:14:16

标签: flex data-binding actionscript air mxml

AS

[Bindable]
var object:Object = {
    property: "Property"
};

MXML

<s:Label text="{object.property}"/>

标签文本将为“Property”,但如果更改了object.property,则不会更新标签。有没有办法解决这个问题?

2 个答案:

答案 0 :(得分:4)

除非已实施,否则对象或集合的属性不会调度属性更改事件。

与您的示例相同,不会绑定对Array元素的更改。

ArrayCollection等集合在代理中包装对象以分派事件以进行绑定。

使用ObjectProxy将更改分派给您的对象。

实例化ObjectProxy并侦听PropertyChangeEvent:

objectProxy = new ObjectProxy(object);
objectProxy.addEventListener(PropertyChangeEvent.PROPERTY_CHANGE, propertyChangeHandler);

通过代理访问您的对象,例如设置名为“property”的属性:

objectProxy.property = "Hello, world";

此示例创建一个带有计时器的ObjectProxy,以便每秒更改“属性”成员:

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
               xmlns:s="library://ns.adobe.com/flex/spark"
               xmlns:mx="library://ns.adobe.com/flex/mx"
               minWidth="955"
               minHeight="600"
               creationComplete="creationCompleteHandler(event)">


    <fx:Script>
        <![CDATA[
            import mx.events.FlexEvent;
            import mx.events.PropertyChangeEvent;
            import mx.utils.ObjectProxy;


            private var object:Object = {};
            private var objectProxy:ObjectProxy;

            private var timer:Timer;

            protected function creationCompleteHandler(event:FlexEvent):void
            {
                objectProxy = new ObjectProxy(object);
                objectProxy.addEventListener(PropertyChangeEvent.PROPERTY_CHANGE, propertyChangeHandler);

                timer = new Timer(1000);
                timer.addEventListener(TimerEvent.TIMER, timerHandler);
                timer.start();
            }

            protected function propertyChangeHandler(event:PropertyChangeEvent):void
            {
                label.text = (event.source).property;
            }

            protected function timerHandler(event:TimerEvent):void
            {
                objectProxy.property = Math.random() * 1000;
            }
        ]]>
    </fx:Script>


    <s:Label id="label" />


</s:Application>

答案 1 :(得分:1)

你绑定到对象本身。这意味着,只有在改变对象的引用时,标签的文本才会改变。

object={property:"Hello World"}

在这种情况下,绑定将完成工作。

如果您希望在更改某些属性后更新文本,则应将此属性设置为Bindable。

public class MyObject {
    [Bindable]
    public var property:String;
}

然后声明类MyObject的变量并绑定到其property