2011-10-26 3 views
1

Flex 어플리케이션의 DataGrid 열에 DropDownLists를 표시해야합니다. 여기에 내가 뭐하는 거지입니다 :Flex : DropDownList의 dataProvider를 GridItemRenderer에 전달하려면 어떻게해야합니까?

첫째, 커스텀 아이템 렌더러를 생성하고 그것을 드롭 다운리스트의 dataProvider로 사용될 것 IList의 인 속성 전달하는 아이템 렌더러 기능이 있습니다

private function rendererFunction(item:Object):ClassFactory {  
      var itemRenderer:ClassFactory = new ClassFactory(AudActionDropDownIR); 
      itemRenderer.properties = {AudActionData: AudActionData}; 
      return itemRenderer; 
     } 
을 드롭 다운리스트를 위해하는 dataProvider으로 사용됩니다 필터링 된 ArrayCollection으로 변환된다 렌더러 (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의 :

이 사용자 정의 항목 렌더러 클래스에 대한 코드입니다.

저는이 문제에 몇 가지 문제점이 있습니다.

먼저 렌더러를 만들 때 어떻게 init 함수를 호출 할 수 있습니까? 둘째, 열의 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를 재정의하거나 측정해야 할 수도 있습니다.