Flex中的某些[Bindable]属性有效,有些则没有

时间:2009-07-09 22:24:25

标签: flex data-binding bindable

问题已解决,请参阅下文

问题

我在Flex Builder 3中工作,我有两个ActionScript 3类(ABCXYZ)和一个Flex MXML项目(main.mxml)。我有XYZ的实例作为ABC的属性,我希望XYZ的属性在文本控件的Flex项目中可见([Bindable])。< / p>

不幸的是,只有prop3prop4在更改后才会更新。我已进入调试器以确保prop1prop2发生更改,但文档控件中未更新它们。

以下是代码:

ABC.as

[Bindable]
public class ABC extends UIComponent {
    /* Other properties */

    public var xyz:XYZ = new XYZ();

    /* Methods that update xyz */
}

XYZ.as

[Bindable]
public class XYZ extends Object {
     private var _prop1:uint = 0;
     private var _prop2:uint = 0;
     private var _prop3:uint = 0;
     private var _prop4:uint = 1;

     public function get prop1():uint {
         return _prop1;
     }

     public function set prop1(value:uint):void {
         _prop1 = value;
     }

     /* getters and setters for prop2, prop3, and prop4 */
}

main.mxml

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:com="com.*" />
    <com:ABC id="abc" />
    <mx:Text text="{abc.xyz.prop1}" />
    <mx:Text text="{abc.xyz.prop2}" />
    <mx:Text text="{abc.xyz.prop3}" />
    <mx:Text text="{abc.xyz.prop4}" />
</mx:Application>

答案

我发布的小代码片段并不明显,但是从XYZ _prop3内部我使用他们的二传手更新了_prop4_prop1。相反,我通过他们的私有变量而不是他们的setter更新了_prop2和{{1}}。因此,属性1和2不会调度更新事件。

2 个答案:

答案 0 :(得分:6)

看起来你的吸气剂正在回归空洞。根据你的田野类型,他们应该回归。

否则您的代码应该正常工作。我已经组装并测试了一个带有Timer的工作版本,它设置了所有四个值,因此您可以看到所有四个更新:

<强> Main.mxml:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" xmlns:local="*" creationComplete="onCreationComplete()">

    <mx:Script>
        <![CDATA[

            private function onCreationComplete():void
            {
                var t:Timer = new Timer(1000);
                t.addEventListener(TimerEvent.TIMER, t_tick);
                t.start();
            }

            private function t_tick(event:TimerEvent):void
            {
                var i:uint = Timer(event.currentTarget).currentCount;

                abc.xyz.prop1 = i;
                abc.xyz.prop2 = i;
                abc.xyz.prop3 = i;
                abc.xyz.prop4 = i;
            }

        ]]>
    </mx:Script>

    <local:ABC id="abc" />

    <mx:VBox>
        <mx:Text text="{abc.xyz.prop1}" />
        <mx:Text text="{abc.xyz.prop2}" />
        <mx:Text text="{abc.xyz.prop3}" />
        <mx:Text text="{abc.xyz.prop4}" />
    </mx:VBox>

</mx:Application>

<强> ABC.as

package
{
    import mx.core.UIComponent;

    [Bindable]
    public class ABC extends UIComponent
    {
        public var xyz:XYZ = new XYZ();

        public function ABC()
        {
            super();
        }
    }
}

<强> XYZ.as

package
{
    [Bindable]
    public class XYZ extends Object
    {
        private var _prop1:uint = 0;
        private var _prop2:uint = 0;
        private var _prop3:uint = 0;
        private var _prop4:uint = 1;

        public function XYZ()
        {
            super();
        }

        public function get prop1():uint {
            return _prop1;
        }

        public function set prop1(value:uint):void {
            _prop1 = value;
        }

        public function get prop2():uint {
            return _prop2;
        }

        public function set prop2(value:uint):void {
            _prop2 = value;
        }

        public function get prop3():uint {
            return _prop3;
        }

        public function set prop3(value:uint):void {
            _prop3 = value;
        }

        public function get prop4():uint {
            return _prop4;
        }

        public function set prop4(value:uint):void {
            _prop4 = value;
        }
    }
}

看看那些,插入内容,你应该看到它们都在一起。如果您有任何疑问,请回复。欢呼声。

答案 1 :(得分:1)

通过使用getter和setter定义可绑定源时,绑定似乎不起作用。解决方案是为getter声明一个可绑定事件,并在setter中调度该事件:

[Bindable]
public class XYZ extends Object {
     private var _prop1:uint = 0;
     private var _prop2:uint = 0;
     private var _prop3:uint = 0;
     private var _prop4:uint = 1;

     [Bindable(event="prop1Changed")]
     public function get prop1():uint {
         return _prop1;
     }

     public function set prop1(value:uint):void {
         _prop1 = value;
         dispatchEvent (new Event ("prop1Changed"));
     }

     /* getters and setters for prop2, prop3, and prop4 */
}

因此,只要您的私有成员发生更改,就会调度一个事件,通知任何链接到getter的组件,该属性已更改。