Flex:对象上的数据绑定

时间:2009-01-05 18:11:33

标签: flex actionscript

假设我有以下内容:

public class MyObject
{

[Bindable]
public var foo:int = 3;


}

...

[Bindable]
var _obj:MyObject = null;

绑定foo的最佳方法是什么,以便在_obj设置为新实例时更新此绑定?

我试过了:

<mx:Label text="{_obj&amp;&amp;_obj.foo}"/>

但它不漂亮。我可以用某种方式表达这个

SO :: Flex社区的想法是什么?

4 个答案:

答案 0 :(得分:2)

绑定不依赖于属性;您可以获得绑定字段或属性的好处。

看起来你可能会留下一些东西,也许吧?例如,一旦类及其实例标记为Bindable,以下MXML和AS就可以在字段和属性上进行绑定:

package
{
    [Bindable]
    public class MyFoo
    {
        public var myPublicField:int;
        private var _myPrivateField:int;

        public function MyFoo()
        {
            myPublicField = 0;
            myPublicProperty = 0;
        }

        public function get myPublicProperty():int
        {
            return _myPrivateField;
        }

        public function set myPublicProperty(value:int):void
        {
            _myPrivateField = value;
        }
    }
}

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

    <mx:Script>
        <![CDATA[

            [Bindable]
            private var myFoo:MyFoo;

            private function increment():void
            {
                if (!myFoo)
                    myFoo = new MyFoo();

                myFoo.myPublicField += 1;
                myFoo.myPublicProperty += 1;
            }

            private function replace():void
            {
                myFoo = new MyFoo();
            }

        ]]>
    </mx:Script>

    <mx:VBox>
        <mx:HBox>
            <mx:Label text="Field:" />
            <mx:Text text="{myFoo.myPublicField}" />
        </mx:HBox>
        <mx:HBox>
            <mx:Label text="Property:" />
            <mx:Text text="{myFoo.myPublicProperty}" /> 
        </mx:HBox>
        <mx:Button label="Increment Both Counts" click="increment()" />
        <mx:Button label="Replace with New Foo" click="replace()" />
    </mx:VBox>

</mx:Application>

顺便提一下,如果你单独标记字段和属性Bindable,而不是标记类,这只是相同的简写,效果将是相同的。另请注意,myFoo默认情况下为null,如示例代码中所示(即“= null”赋值是多余的)。

这个例子有帮助吗?如果没有,请发表评论,我会回来查看。希望它能做到!

答案 1 :(得分:1)

使类可绑定:

[Bindable]
public class MyObject
{
    [Bindable]
    public var foo:int = 3;
}

然后,这有用吗?

<mx:Label text="{_obj.foo}"/>

答案 2 :(得分:0)

使用属性而不是公共变量。

// Object

package MyObject
{
    public class MyObject
    {
        private var message:String;

        public function set Message(messagein:String):void
        {
            message = messagein;
            return;
        }

        [Bindable]
        public function get Message():String
        {
            return message;
        }

        public function MyObject()
        {
        }

    }
}

// Flex that calls it

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" width="281" height="156">
<mx:Script>
    <![CDATA[
        import MyObject.MyObject;
        [Bindable]
        private var o:MyObject = new MyObject();

        private function UpdateMessage():void
        {
            o.Message = TextIn.text;
            return;
        }
    ]]>
</mx:Script>
    <mx:Label x="31" y="29" text="{o.Message}" width="201" id="TextOut"/>
    <mx:TextInput x="31" y="55" id="TextIn"/>
    <mx:Button x="31" y="85" label="Button" click="UpdateMessage()"/>

</mx:Application>

答案 3 :(得分:0)

我会看看mx.binding.utils.BindingUtils类。您可能会在那里找到一些东西,但(正如Christian Nunciato所说)数据绑定实际上是为对象的属性中的更改而构建的,而不是对象本身。

干杯