为模型和视图层传递数据提供了一种快捷的机制。以下场景不适用:
1)界面需要按严格顺序更新;
2)只有某些特定时期才需要告知属性的变化。
使用方法
1. {} :返回值类型必须与目的属性兼容,可以使用有返回值的函数、字符串连接符、算数和逻辑表达式。常用于定义视图上的控件属性随模型数据的变化而变化。
2. <mx:Binding> : source属性可以使用 {} 包含表达式,用于1)模型上的数据随着控件的输入数据变化而变化。 2)建立同一目的属性与多个不同源属性的绑定关系
3. BindingUtils: 动态定义数据绑定,但很少使用。
定义方式
源使用[Bindable]定义,产生propertyChangeEvent 事件
也可以定义事件的名称,如[Bindable(event=”fooChanged”)] ,这样需要自己创建或发出该事件才能触发事件绑定(不推荐)。
属性
Public类:全部的public变量、具有get和set的属性
函数
a) 可绑定的属性作为函数的参数,实例如下:
<mx:TextArea text=”{usdFormater.format(a)}”>
b) 带返回值的函数作为数据源
常用于某一个属性对外只提供get方法,该值在类内被改变时,调用地方能通过get方法取得新值
private var _contacts:ArrayCollection;
[Bindable(event="contactsChanged")]
public function get contacts():ArrayCollection
{
return _contacts;
}
// Stores given contacts and the current search keyword
public function saveContacts( list:ArrayCollection, searchKey:String ):void
{
_contacts = list;
//trigger binding by dispatching change event
dispatchEvent( new Event( "contactsChanged" ) );
lastSearch = searchKey;
}
对象
如果想让对象绑定起作用,需要保证对象和对象所属类都绑定,如
Private var foo:MyObject; {foo.name}如果要起作用,则MyObject的name属性和foo对象都要绑定
将Object类的属性绑定:使用ObjectProxy对象,如Object info=new ObjectProxy();
数组
使用ArrayCollection作为绑定源,且使用 getItemAt访问数据元素,如下:
[Binable]
Public var myAC:ArrayCollection=new ArrayCollection([1,3,5]);
<mx:Text id=”text2” text=”{myAC.getItemAt(0)}”> //如果使用myAC[0]则只在引用或数组引用更新时触发,而0的元素变化时不会触发
发生时机
源属性被改变
源对象发出initialize事件时
调用executeBinding()方法
可以使用mx.binding.utils.ChangeWatcher观察数据绑定,观察者在数据绑定发生时,会激活一个事件,如 ChangeWatcher.watch(textarea,”text”, 监听函数)