Apache flex Flex work中的一些[Bindable]属性,一些don';T

Apache flex Flex work中的一些[Bindable]属性,一些don';T,apache-flex,data-binding,bindable,Apache Flex,Data Binding,Bindable,问题已解决,请参见下文 问题: 我在Flex Builder 3中工作,我有两个ActionScript 3类(ABC和XYZ)和一个Flex MXML项目(main.MXML)。我有一个XYZ的实例作为ABC的属性,我希望XYZ的属性在文本控件的Flex项目中可见([Bindable]) 不幸的是,只有prop3和prop4在更改时才会更新。我已进入调试器,以确保prop1和prop2发生更改,但它们不会在文本控件中更新 代码如下: 美国广播公司 XYZ.as 主程序文件 答复 从我发布的

问题已解决,请参见下文

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

不幸的是,只有
prop3
prop4
在更改时才会更新。我已进入调试器,以确保
prop1
prop2
发生更改,但它们不会在文本控件中更新

代码如下:

美国广播公司 XYZ.as 主程序文件

答复
从我发布的小代码片段中看不出这一点,但在
XYZ
中,我使用设置器更新了
\u prop3
\u prop4
。相反,我通过它们的私有变量而不是设置器更新了
\u prop1
\u prop2
。因此,属性1和属性2没有分派更新事件。

看起来您的getter正在返回空洞。根据字段类型,他们应该返回UINT

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

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>
XYZ.as

package
{
    import mx.core.UIComponent;

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

        public function ABC()
        {
            super();
        }
    }
}
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;
        }
    }
}

看看这些,插上电源,你会看到所有的东西都在一起。如果您有任何问题,请发回。干杯。

当您通过使用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的任何组件该属性已更改。

事实上,我只是在这里犯了void返回类型错误。我实际代码中的所有setter都返回uint。抱歉搞混了。好的。那么我在这里发布的代码应该对您有用——我已经测试过了。您可以自由地运行它,并将其与您现在拥有的进行比较,然后使用您需要的任何部件来修复您的终端。祝你好运抱歉,这么长时间了,我有一点不懂代码了。我刚刚尝试了您的测试示例,它成功了,所以我想我的代码中有一个bug。谢谢啊哈,我修好了。事实证明,当我更改属性3和4(从XYZ内部)时,我正在使用属性的setter,从而触发要调度的适当事件。对于属性1和2,我通过修改_prop1和_prop2来更改它们。因为我没有呼叫setter,所以没有发送任何事件。我想我今天学到了一些东西:)太棒了!很高兴这有帮助。干杯。:)如果类被标记为[Bindable],则不需要这样做。还需要为每个属性设置特定的侦听器——作为一个例子,这很好,但OP要求的是开箱即用的东西,应该“正常工作”,而不需要所有额外的黏液。你是对的。如果类被标记为可绑定的,则不需要显式地标记属性。
package
{
    import mx.core.UIComponent;

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

        public function ABC()
        {
            super();
        }
    }
}
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;
        }
    }
}
[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 */
}