2011-10-26 5 views
1

FlexアプリケーションのDataGridの列にDropDownListsを表示する必要があります。ここで私はやっているものです:フレックス:DropDownListのdataProviderをGridItemRendererに渡すにはどうすればよいですか?

まず、私は、カスタムアイテムレンダラーを作成するアイテムレンダラー機能を持っており、それをDropDownListコントロールのdataProviderのとして使用されるIListのあるプロパティを渡します。

private function rendererFunction(item:Object):ClassFactory {  
      var itemRenderer:ClassFactory = new ClassFactory(AudActionDropDownIR); 
      itemRenderer.properties = {AudActionData: AudActionData}; 
      return itemRenderer; 
     } 

これは、カスタムアイテムレンダラークラスのコードである。レンダラ(AudActionData)に渡され

<fx:Script> 
     <![CDATA[ 
      import mx.collections.ArrayCollection; 
      import mx.collections.IList; 
      [Bindable] 
      public var TheData:ArrayCollection = new ArrayCollection(); 
      public var AudActionData:IList; 

      public function init():void 
      { 
       TheData = new ArrayCollection(AudActionData.toArray()); 
       TheData.filterFunction = filterTheData; 
       TheData.refresh(); 
      } 

      private function filterTheData(item:Object):Boolean { 
       return item.AUD_STEP_TYPE_ID == data.AUD_STEP_TYPE_ID; 
      } 
     ]]> 
    </fx:Script> 
<s:DropDownList id="theList" 
       labelField="AUD_ACTION_DESCR" 
       requireSelection="true" 
       selectedIndex="0" 
       dataProvider="{TheData}" 
       width="100%"/> 

ザのIListは、ドロップダウンリストのためのdataProviderとして使用される濾過のArrayCollectionに変換されます。

私はこれにいくつか問題があります。

まず、レンダラーの作成時にinit関数を呼び出すにはどうすればよいですか? 2番目に、列のitemRendererFunction = "rendererFunction"を設定すると、アプリは起動せず、白い画面が表示されます。しかし、itemRenderer = "components.AudActionDropDownIR"を設定すると、アプリケーションは起動しますが、もちろんドロップダウンリストにはデータはありません。

アイデア?ありがとう!

答えて

0

まず、initメソッドを作成し、それをレンダラーのcreationCompleteで呼び出すことで、これを行うことができます。しかし、仮想化を使用する予定がない限り、私はそれを助言しません。私がこれを言うのは、ユーザーがスクロールするときにデータが変更されたときに更新が表示されず、古い古いデータがDataGridの行に表示されているように見えるからです。

代わりに、このような何かを:アドビの例は、このためにデータバインディングを使用するための優先性を示すことにあなたは気づいているかもしれません

private var _data:*; 
private var _dataChanged:Boolean; 
override public function get data():*{ 
    return _data; 
} 
override public function set data(value:*):void { 
    if (value != _data) { 
     _data = value; 
     super.data=value; 
     _dataChanged=true; 
     invalidateProperties(); 
    } 
} 

override protected function commitProperties():void { 
    super.commitProperties(); 
    if (_dataChanged) { 
     //this is just example code of how you'd update your own subcomponents 
     someLabel.text = _data['property']; 
     //more updating 
    } 
} 

、そしてその理由は、あなたは、強力なパフォーマンスを持っていない場合上に示したコードの種類を書く理由は、はるかに簡単です。一部の更新では、updateDisplayListをオーバーライドする必要があります。

関連する問題