[Flex][AS3]ActionScript内でのバインディングコントロール

例えば、動的に生成されたコンポーネントをバインディングさせたい場面など、
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で同じ機能を実現しようとすると
自分で登録すべき事が多く(今回のサンプルに限らず)
難易度は高くなるのですが、実現できる事も多いので
是非知っておく事をお勧めします。

 

このブログについて

このブログは吉祥寺にあるブレインチャイルド株式会社の社員で投稿しています。
業務ではまってしまったことや発見したこと。
自分達で新たに学習してみようと思って勉強し始めたことなどを綴っています。
こんな社員が働いているブレインチャイルドに興味がわいててきたなら、是非お問い合わせください。
会社案内
求人案内
先輩のコメント