IDropInListItemRenderer, BaseListData

뭔가.. itemRenderer를 만드려고 한 것 같은데…
컴포넌트 안에 이런 식으로 반복적으로 소스가 들어있었다.


var targetDataGrid:AdvancedDataGrid = this.parent.parent.parent as AdvancedDataGrid;
if (targetDataGrid == null) {
    targetDataGrid = this.parent.parent as AdvancedDataGrid;
}
trace("targetDataGrid"+targetDataGrid);
if (targetDataGrid == null) {
    return;
}

이게 제대로 작동하는지도 잘 모르겠지만..;; 일단 눈에 보기부터 너무 거슬리는 코드다.
itemRenderer에서 AdvancedDataGrid에 접근을 하려는 의도였던 것 같은데.. 이런 식으로 뭐가 떨어질지도 모르는 parent.parent.. 식으로 null체크 하면서 찾아 들어가기 보다는 IDropInListItemRenderer 인터페이스를 구현하는 것을 추천한다.
IDropInListItemRenderer 인터페이스를 찾아보면


public function get listData():BaseListData
public function set listData(value:BaseListData ):void

참고: http://flexdocs.kr/docs/flex2/langref/mx/controls/listClasses/IDropInListItemRenderer.html

인터페이스를 사용하면서 구현해 주어야 할 것은 get/set 메소드 하나밖에 없다.
set함수에서는 BaseListData 타입의 값을 넘겨주고 있다.
BaseListData 클래스에는 4개의 속성이 있다.

label:String 리스트 클래스의 itemToLabel() Methods에 근거한 아이템 데이터의 텍스트 표현입니다.
owner:IUIComponent 이 아이템을 소유하는 리스트 object에의 참조입니다.
rowIndex:int 데이터 프로바이더내의 아이템의 인덱스입니다.
uid:String 이 아이템의 일의의 식별자입니다.

참고: http://flexdocs.kr/docs/flex2/langref/mx/controls/listClasses/BaseListData.html

이 중에 owner속성이 itemRenderer가 속한 AdvancedDataGrid 객체이다.
대략 보면


private var _listData:BaseListData;
private var _dataGrid:AdvancedDataGrid;
private var _dataField:String;
private var _dataProvider:ArrayCollection;

public function get listData():BaseListData
{
    return _listData;
}

public function set listData(value:BaseListData):void
{
    if (value == null) return;

    _listData = value;
    _dataGrid = value.owner as AdvancedDataGrid;
    _dataField = (value as AdvancedDataGridListData).dataField;

    _dataProvider = _dataGrid.dataProvider as ArrayCollection;
}

이런 식으로 사용이 가능하다.
AdvancedDataGrid에 접근한 이후에는 dataProvider라던지 기타 속성에 얼마든지 접근할 수 있다. 특히 자주 쓰이는- AdvancedDataGrid에 CheckBox를 itemRenderer로 사용하는 경우 등등에 매우 유용하다.