2011-07-26 4 views
0

バインド可能なオブジェクトを含むArrayCollectionがあります。私は以下のような複数の場所でそれらにアクセスしたいと思います(分かりやすくするためにラベルは1つだけです)。それをどうすれば実現できますか?私はArrayCollectionディスパッチ特殊イベント(?)のための何らかのラッパーを、Flexイベントメカニズムがキャッチ可能なもので書くべきですか?バインドメカニズムによる変更の表示を許可するArrayCollectionラッパー

<?xml version="1.0" encoding="utf-8"?> 
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
       xmlns:s="library://ns.adobe.com/flex/spark" 
       xmlns:mx="library://ns.adobe.com/flex/mx" 
       creationComplete="init()"> 


    <mx:VBox> 
     <s:Label id="lb" text="{lab(col)}" /> 
     <s:Button click="onC(event)" color="0x000000"/>  
    </mx:VBox> 

    <fx:Script> 
     <![CDATA[ 
      import mx.collections.ArrayCollection; 
      import mx.events.CollectionEvent; 
      import mx.events.PropertyChangeEvent; 

      import spark.events.ListEvent; 

      [Bindable] private var col:ArrayCollection; 

      private function init():void { 
       col = new ArrayCollection(); 
       col.addItem({ val: 1 }); 
       col.addItem({ val: -1 }); 
      } 

      private function onC(event:MouseEvent):void { 
       col.getItemAt(0).val++; 

       trace(col.getItemAt(0).val); 
      } 

      private function lab(_:ArrayCollection):String { 
       for(var i:int = 0; i < col.length; i++) { 
        if(col.getItemAt(i).val > 0) 
         return col.getItemAt(i).val.toString(); 
       } 

       return "-666"; 
      } 

     ]]> 
    </fx:Script> 
</s:Application> 

私はこのようなラッパーを作成したいと思います:結合メカニズムがうまくいくように

 public class BindableArrayCollection extends EventDispatcher { 

    [Bindable] private var _ac:ArrayCollection; 

    public function BindableArrayCollection() { 
     this.ac = new ArrayCollection(); 
    } 


    [Bindable] 
    public function set ac(val:ArrayCollection):void { 
     if(_ac != null) 
      _ac.removeEventListener(CollectionEvent.COLLECTION_CHANGE, toggleChangeEvent); 

     _ac = val; 

     if(_ac != null) 
      _ac.addEventListener(CollectionEvent.COLLECTION_CHANGE, toggleChangeEvent); 

     toggleChangeEvent(); 
    } 

    public function get ac():ArrayCollection { 
     return _ac; 
    } 

    public function toggleChangeEvent(_:Object = null):void { 
     dispatchEvent(....); 
    } 
} 

。私は "...."の代わりに何を置くべきですか?

答えて

0

あなたが始めているようです。私がここでバインドできるのは、ArrayCollectionであり、その中のオブジェクトではありません。あなたのアプリケーション内のどこにでもコレクション(または任意のデータ)をアクセス可能にしたい場合、それらのクライアントコードはアクセスする方法を知る必要があります。 1つの可能なアプローチは、シングルトンデザインパターンを実装することです。http://www.squidoo.com/flash-tutorials_as3-singleton-design-patternこれは、データをより「グローバル」にするための良い出発点になります。

+0

これは実際にはより良い散歩かもしれない... http://www.swinburne.edu.au/design/tutorials/P-flash/T-How-to-build-a-Singleton-in-Actionscript- 3/ID-143/ –

+0

ありがとうございますが、それはポイントではありません。 ArrayCollection内の要素の変更は、バインディングのメカニズムではわかりません。私はそれを強制的に働かせる方法を尋ねるだけです。私は多くの要素を持つArrayCollectionを持っている状況があります。私は検索方法を使ってラベルの中のいくつかを示したいと思います。 。 「値」プロパティは毎秒更新され、画面に表示されるようにします。 –

1

あなたの問題は、ラベルがあなたのArrayCollectionにある値を表示していないということですか? LabelにはDataGridListのようなArrayCollectionの更新メカニズムがないので、そうです。
ArrayCollectionはバインド可能ですが、これは、の変数値を変更した場合にのみlab(col)関数が実行されることを意味します。
col = new ArrayCollection();を設定し、この時点でバインディングが実行されます。その後でコレクションに値を追加します。ラベル表示を更新する

  1. コールlb.executeBindings():この問題を解決するための2通りの方法があります。
  2. CollectionEvent.COLLECTION_CHANGEを聞くと、そのアイテムが変更されたときにArrayCollectionが送出されます。

希望すると、これが役に立ちます。

+0

"executeBindings(true)"を使用してVGroup内の複数のラベルを更新しようとしましたが、うまくいきませんでした:( –

+0

@just_me何らかの理由でブールparamがメソッド実装で全く使用されないため、executeBindingsを直接適用する必要があります。各ラベルに –

関連する問題