1

カスタムデータグリッドがあります。私はhsliderの値をプロパティ基準を介してそれに渡します。GridItemRendererを拡張するこのデータグリッド用の外部itemrendererがあります。このプロパティ基準に基づいてアイテムレンダラーを動的に変更したいと思います。'criteria'である親コンポーネントからプロパティにアクセスするには、listDataプロパティにアクセスします。そのために、このカスタムデータグリッドはIDropinItemRenderを実装します。しかし、listDataの値はnullになります。私のメインアプリケーションでは、このデータグリッドを次のように使用しています。

<components:Mydatagrid dataProvider="{ac}" criteria="{hslider.value}">
<components:columns>
        <s:ArrayList>
            <s:GridColumn dataField="name" headerText="Name"></s:GridColumn>
            <s:GridColumn dataField="age" headerText="Age"></s:GridColumn>
            <s:GridColumn dataField="hair" headerText="Hair" itemRenderer="renderer.GridInlineDynamicRenderer"   />
        </s:ArrayList>
    </components:columns>
</components:Mydatagrid>

これは私のアイテムレンダラーコードです。setdata関数の2行目のlistDataプロパティがnullです。

<?xml version="1.0" encoding="utf-8"?>
<s:GridItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009" 
                xmlns:s="library://ns.adobe.com/flex/spark" 
                xmlns:mx="library://ns.adobe.com/flex/mx" 
                clipAndEnableScrolling="true" implements="mx.controls.listClasses.IDropInListItemRenderer" >
<fx:Script>
    <![CDATA[
        import mx.controls.dataGridClasses.DataGridListData;
        import mx.controls.listClasses.BaseListData;

        import components.Mydatagrid;
        private var _listData:BaseListData;
        public function get listData() : BaseListData
        {
            return _listData;
        }
        public function set listData( value:BaseListData ) : void
        {
            _listData = value;
        }
        protected function button1_clickHandler(event:MouseEvent):void
        {
            dispatchEvent(new Event('hairEvent',true));
        }
        override public function set data(value:Object):void
        {
            super.data = value;
            var myListData:DataGridListData = DataGridListData(listData);
            var criteria:Number = (myListData.owner as Mydatagrid).criteria;
            hairClr.setStyle('color',data.hair);
            if(data.age < criteria)
                alpha = 0.4;
            else
                alpha = 1;
        }
    ]]>
</fx:Script>

<mx:HBox> 
    <s:Button click="button1_clickHandler(event)" label="Button" />
    <s:Label id="hairClr" text="Color" />
</mx:HBox>

</s:GridItemRenderer>

listDataはここでnullになります。しかし、リストコンポーネントでアイテムレンダラーを使用すると、機能します。アイテムレンダラーのコードは、リストの場合、アイテムレンダラーがHBoxを拡張することを除いて同じです。このコードへのリンクは、このhttp://www.adobe.com/devnet/flex/articles/itemrenderers_pt3.htmlです。datagridで同じことを実装しようとしています。

<?xml version="1.0" encoding="utf-8"?>
<mx:HBox xmlns:fx="http://ns.adobe.com/mxml/2009" 
                xmlns:s="library://ns.adobe.com/flex/spark" 
                xmlns:mx="library://ns.adobe.com/flex/mx" width="100%" height="100%" implements="mx.controls.listClasses.IDropInListItemRenderer">
<fx:Script>
    <![CDATA[
        import mx.controls.listClasses.BaseListData;

        import components.MyList;

        private var _listData:BaseListData;
        public function get listData() : BaseListData
        {
            return _listData;
        }
        public function set listData( value:BaseListData ) : void
        {
            _listData = value;
        }
        protected function button1_clickHandler(event:MouseEvent):void
        {
            dispatchEvent(new Event('hairEvent',true));
        }
        override public function set data(value:Object):void
        {
            super.data = value;
            var criteria:Number = (listData.owner as MyList).criteria;
            hairClr.setStyle('color',data.hair);
            if(data.age < criteria)
                alpha = 0.4;
            else
                alpha = 1;
        }
    ]]>
</fx:Script>

    <s:Button click="button1_clickHandler(event)" label="Button" />
    <s:Label id="hairClr" text="Color" />
</mx:HBox>
4

0 に答える 0