0

私はまったくの Flex 初心者で、イベント モデルに苦労しています。次のシナリオがあります。

  • dataProvider が ArrayCollection に設定された DataGrid を持つ
  • データ グリッドはシンプルな To Do リストで、最初の列にはアイテム レンダラーとしてチェック ボックスが含まれています
  • 他の列はプレーン文字列です

私が達成する必要があるのは、データ グリッドが作成または初期化された後、アイテム レンダラー値のカラー スタイルを条件付きで更新する必要があることです。条件は、プロパティ Done (データ プロバイダーに格納されている) の値が true の場合、テキストの色を灰色に設定することを示しています。

問題は、データ グリッドが作成される前にアイテム レンダラーが初期化されるため、アイテム レンダラーで取得できるデータ グリッド参照が NULL になることです。そこで、データ グリッドが完成したらアイテム レンダラーに通知することにました。問題は、Flex イベント モデルを使用してそれを行う方法です。

データ グリッドによってディスパッチされたイベントが、アイテム レンダラーによってリッスンされていないようです。私のコードを見てください:

<!-- Data grid inside root panel main.mxml -->
<mx:DataGrid id="taskGrid" dataProvider="{tasks}" creationComplete="dispatchEvent(new Event('update',true));">
 <mx:columns>
  <mx:DataGridColumn dataField="done" headerText="!">
   <mx:itemRenderer>
     <mx:Component>
       <c:StatusCheckBox change="this.onChange(event);"/>
     </mx:Component>
   </mx:itemRenderer>
  </mx:DataGridColumn>
  <mx:DataGridColumn dataField="status" headerText="Status" editable="false" itemRenderer="components.CustomLabel"/>
 </mx:columns>
</mx:DataGrid>

<!-- components.CustomLabel.mxml -->
<mx:Label xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="init();">
 <mx:Script >
   <![CDATA[
    import (...)
    private var dg:DataGrid; 
    private var tasks:ArrayCollection;

    private function init():void {
     dg = this.listData.owner as DataGrid;  
     addEventListener("update",updateStyle); 
     if (dg) Alert.show("dg is not null!"); // data grid is not null when init() finish
    }

    private function updateStyle(e:Event = null):void {
     if (dg) {
      if (listData.rowIndex < dg.dataProvider.length) {
       var task:Task = dg.dataProvider[listData.rowIndex] as Task;
        if (task.done) this.setStyle("color","Blue");
        else this.setStyle("color","Black");
       }
      } 
     }
   ]]>
  </mx:Script>
 </mx:Label>

アプリケーションを起動してデータ グリッドが作成されると、'update' イベントがトリガーされます。ただし、CustomLabel コンポーネントの updateStyle 関数で使用されるデータ グリッド インスタンス (dg) は null です。なぜ今nullなのですか?init() メソッドでわかるように、dg 変数は null ではありません (アイテム レンダラーのインスタンスごとにアラートがポップアップします)。

私たちを手伝ってくれますか?どうもありがとう。

4

1 に答える 1

0

イベントをリッスンするとdataChange、ハンドラーをトリガーできます。

于 2010-01-21T06:12:19.707 に答える