例えば、動的に生成されたコンポーネントをバインディングさせたい場面など、
mxmlでは設定できません。
そこでActionScriptクラス内でバインディングの登録をする事になりますが
以外に設定方法がやっかいです。
以下はそのサンプルになります。
[mxmlでバインディングを行う場合]
<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"> <mx:Script> <![CDATA[ /** * テキストインプットに入力された情報は_bindTxtに格納されます。 * ラベルは_bindTxtをバインディングしている為、 * テキストインプットの内容が変わると、自動的にラベルのテキストにも反映されます。 */ [Bindable] private var _bindTxt:String = ""; private function bindTxi_changeHandler():void { _bindTxt = bindTxi.text; } ]]> </mx:Script> <mx:Label x="27" y="28" text="テキストを入力してボタンクリック" width="160"/> <!-- バンディング元--> <mx:TextInput id="bindTxi" change="bindTxi_changeHandler()" x="27" y="54"/> <!-- バンディング先 --> <mx:Label text="{this._bindTxt}" x="195" y="56" width="172" id="bindlbl"/> </mx:Application>
mxmlでバインディングの登録を行う場合、
ラベルのtextの指定で、{}を行い、変数に[Bindable]を書くだけで簡単にバインディングが登録されます。
では、動的にラベルが作成された場合はどうなるでしょう?
以下がサンプルです。
<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"> <mx:Script> <![CDATA[ import mx.controls.Label; /** * テキストインプットに入力された情報は_bindTxtに格納されます。 * ラベルは_bindTxtをバインディングしている為、 * テキストインプットの内容が変わると、自動的にラベルのテキストにも反映されます。 */ [Bindable] private var _bindTxt:String = ""; private function bindTxi_changeHandler():void { _bindTxt = bindTxi.text; } // ボタンクリックでラベルを作成します。 private function createBtnClick():void { var label:Label = new Label(); label.width = 100; label.height = 30; // キャンバスにラベルを作成 this.testCnb.rawChildren.addChildAt(label,0); // ボタン非活性 createBtn.enabled = false; } ]]> </mx:Script> <mx:Label x="27" y="28" text="テキストを入力してボタンクリック" width="160"/> <!-- バンディング元--> <mx:TextInput id="bindTxi" change="bindTxi_changeHandler()" x="27" y="54"/> <mx:Button id="createBtn" click="createBtnClick()" x="27" y="84" label="ラベルを作成" width="160"/> <mx:Canvas x="195" y="54" width="200" height="22" id="testCnb"> </mx:Canvas> </mx:Application>
ボタンクリックで、ラベルが動的に作成されるサンプルです。
動的に生成されるという事は、mxmlでバインディングの設定を行う事は出来ません。
こうした場合、ActionScriptコード内でバインディング設定を行う事になります。
ActionScriptコード内でバインディングの設定を行う場合、
BindingUtilsを使用します。
BindingUtils.bindProperty(バインディング先のオブジェクト(id),'プロパティ名',バインディング元のクラス,'プロパティ名');
以下はその設定例です。
<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"> <mx:Script> <![CDATA[ import mx.binding.utils.BindingUtils; import mx.controls.Label; /** * テキストインプットに入力された情報は_bindTxtに格納されます。 * ラベルは_bindTxtをバインディングしている為、 * テキストインプットの内容が変わると、自動的にラベルのテキストにも反映されます。 */ private var _bindTxt:String = ""; private function bindTxi_changeHandler():void { _bindTxt = bindTxi.text; } // ボタンクリックでラベルを作成します。 private function createBtnClick():void { var label:Label = new Label(); label.width = 100; label.height = 30; label.text = "XXXX"; // キャンバスにラベルを作成 this.testCnb.rawChildren.addChildAt(label,0); ⇒ //Bindingの設定 ⇒ BindingUtils.bindProperty(label,'text',bindTxi,'text'); // ボタン非活性 createBtn.enabled = false; } ]]> </mx:Script> <mx:Label x="27" y="28" text="テキストを入力してボタンクリック" width="160"/> <!-- バンディング元--> <mx:TextInput id="bindTxi" change="bindTxi_changeHandler()" x="27" y="54"/> <!-- バンディング先 --> <mx:Button id="createBtn" click="createBtnClick()" x="27" y="84" label="ラベルを作成" width="160"/> <mx:Canvas x="195" y="54" width="200" height="22" id="testCnb"> </mx:Canvas> </mx:Application>
バインディング先のプロパティ名を指定したりなど、
全て自分で指定してあげる必要があります。
これにより、バインディングの設定を行う事が可能となります。
今回のサンプルで分かったように、mxmlで設定する場合
flexが自動的にやってくれる事が多い事が分かりました。
それに対して、ActionScriptで同じ機能を実現しようとすると
自分で登録すべき事が多く(今回のサンプルに限らず)
難易度は高くなるのですが、実現できる事も多いので
是非知っておく事をお勧めします。