用静态属性作为数据绑定源
可以将静态属性作为数据绑定表达式的源,Flex 在应用启动时执行一次数据绑定,然后在静态属性发生变化的时候再执行数据绑定。可以将静态常量自动作为数据绑定表达式的
源,Flex 只在应用启动时执行一次数据绑定。因为数据绑定只在应用启东时发生一次,所以可以对静态常量省略[Bindable]元数据标记。
使用函数作为数据绑定源
可将函数作为数据绑定表达式中的一部分。在数据绑定表达式中使用函数的两种常见技术.
【1】将可绑定的属性作为函数的参数以触发函数的执行。
【2】为了响应绑定事件而出发函数的执行。
将对象用于数据绑定
绑定到对象
当使一个对象成为数据绑定表达式的源时,数据绑定发生在这个对象被更新之时,或者这个对象的引用被更新之时,但不能发生在这个对象的单个(数据)域(feild)被更新之时。
为了使对象的属性可绑定,要创建新的类定义.
package myComponents
{
// binding/myComponents/BindableObject.as
// Make all class properties bindable.
[Bindable]
public class BindableObject extends Object {
public function BindableObject() {
super();
}
public var stringProp:String = "String property";
public var intProp:int = 52;
}
}
通过在类定义之前放置[Bindable]元数据标记,就可以使得类中所有public 变量、以及所有完全具备setter 及getter 的public 属性成为可绑定的属性。
在绑定中使用数组
在使用数组进行工作时,比如Array 或者ArrayCollection 对象,可以把数组作为数据绑定表达式的源或目的。
注意:当使用数组作为绑定源时,应该使用ArrayCollection 类型的数组,因为ArrayCollection 类在数组或数组元素发生变化时能够发出事件来触发数据绑定。比如,对
ArrayCollection.addItem(), ArrayCollection.addItemAt(),ArrayCollection.removeItem(), 以及ArrayCollection.removeItemAt()方法的调用都会触发数据绑定。
绑定到数组中的元素
可以使用数组中的单个元素作为数据绑定源,如下例所示:
<?xml version="1.0"?>
<!-- binding/ArrayBinding.mxml -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
[Bindable]
public var myAC:ArrayCollection = new ArrayCollection(["One", "Two", "Three", "Four"]);
[Bindable]
public var myAC2:ArrayCollection = new ArrayCollection(["Uno", "Dos", "Tres", "Quatro"]);
]]>
</mx:Script>
<!-- Data binding updated at application startupand when myAC modified. -->
<mx:Text id="text1" text="{myAC[0]}"/>
<!-- Data binding updated at application startup,when myAC modified, and when myAC[0] modified. -->
<mx:Text id="text2" text="{myAC.getItemAt(0)}"/>
<mx:Button id="button1" label="Change Element" click="myAC[0]='new One'"/>
<mx:Button id="button2" label="Change ArrayCollection" click="myAC=myAC2"/>
</mx:Application>
如果通过方括号语法[]来指定数组元素作为数据绑定表达式的源,那么数据绑定只在应用启动时触发,或者在数组或其引用被更新时触发。当这个数组元素被更新的时候不会触发数据
绑定。但数据绑定表达式中的myAC.getItemAt(0)则会在该数组元素变化时被触发更新。因此,id为 text2 的Text 控件在点击button1 时会被更新,而id 为text1 的Text 控件则不会被更
新。当使用数组中的元素作为数据绑定表示的源时,应当在绑定表达式中使用ArrayCollection.getItemAt()方法。点击button2 时将myAC2 拷贝给myAC,这会触发对数组元素的所有
数据绑定而不论它们是如何实现的。
使用可绑定属性链进行工作当指定一个属性作为数据绑定表达式的源时,Flex 不仅监控这个属性的变化,也会监控这个由这个属性作为开始点的属性链的变化。整个属性链,包括源
属性,被称为“可绑定的属性链”。在下面的例子中,firstName.text 是一个可绑定的属性链:
<mx:Text id="myText" text="{firstName.text}"/>
开发者可以使用很长的属性链,如下例所示:
<mx:Text id="myText" text="{user.name.firstName.text}"/>
只有当text 属性是可绑定的,数据绑定机制才能检查text 属性的变化。但是,如果在运行时,想要向属性链中的部分属性赋予新值,那么属性链中的每个属性都必须是可绑定的,才
能使数据绑定机制起作用。否则,在运行时更改user,name 或者firstName 属性会导致数据绑定机制无法检查text 属性的变化。在使用BindingUtils.bindProperty()或者
BindingUtils.bindSetter()方法时,可以将可绑定的属性链作为方法的参数,例如,bindProperty()方法有以下的声明:
public static function bindProperty(site:Object, prop:String, host:Object, chain:Object, commitOnly:Boolean = false):ChangeWatcher
Host 和chain 属性指定了数据绑定表达式的源。使用bindProperty()方法可以定义一个
数据绑定表达式,如下:
bindProperty(myText, 'text', user, ["name","firstName","text"]);
这个例子中,["name","firstName","text"]定义了相对于user 对象的可绑定属性链。注意,在本例中,user 不是可绑定属性链的一部分。在MXML 数据绑定表达式中,可绑定属性连总
是相对于this。因此,要想定义一个同上面的MXML 等价的数据绑定表达式,应按如下例子使用bindProperty()方法:
bindProperty(myText, 'text', this, ["user", "name","firstName","text"]);