0

DataGrid があり、最初の列セルには、埋め込み画像と doubleClick イベントがリンクされた itemRenderer があります。

そのため、ダブルクリック イベントが発生すると、このレンダラーはイベントとハンドラーをキャッチします。質問は、Datagrid で選択したアイテムのインデックスを使用してイベントをディスパッチしたいのですが、それを取得する方法がわかりません。

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"
                width="50" height="30">

<fx:Script>
    <![CDATA[
        import events.EditItemEvent;

        import mx.controls.Alert;
        override public function prepare(hasBeenRecycled:Boolean):void {}

        protected function btn_edit_doubleClickHandler(event:MouseEvent):void {
            /* here I dispatchEvent with the 'index' of the selectedItem of the datagrid */
        }

    ]]>
</fx:Script>
<s:Image id="btn_edit" horizontalCenter="0" source="@Embed('assets/images/edit_icon.png')"
         verticalCenter="0"
         doubleClickEnabled="true"
         doubleClick="btn_edit_doubleClickHandler(event)"/>

何か案が?

4

2 に答える 2

1

gridを使用できますか。selectedIndex ?

正直なところ、これは悪い考えだと思います。レンダラーは、selectedIndex を含む DataGrid について何も認識してはなりません。表示リスト階層のどこかでレンダラー データを操作できるように、カスタム イベントをディスパッチする場合。インデックスではなく、データを含める必要があります。ハンドラー メソッドはデータを操作します。

于 2013-05-10T13:24:47.383 に答える
0

所有者のプロパティを介してアクセスできます。

(this.owner as DataGrid).selectedIndex

カスタム イベントを送出する単純な itemRenderer:

<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">

<fx:Script>
    <![CDATA[   

        override public function prepare(hasBeenRecycled:Boolean):void {
            lblData.text = data[column.dataField]
        }
        protected function onClickButton(ev:MouseEvent):void {
            trace("ButtonDispatchItemRenderer::onClickButton");
            //dispatch the Event which has a static const GET_SELECTED_INDEX for the event type
            this.owner.dispatchEvent(new MyEvent(MyEvent.GET_SELECTED_INDEX));
        }
    ]]>
</fx:Script>

<s:HGroup verticalAlign="baseline">
    <s:Label id="lblData" top="9" left="7"/>
    <s:Button label="dispatch" click="onClickButton(event)"/>
</s:HGroup>

</s:GridItemRenderer>

イベントをリッスンする DataGrid を持つ単純なアプリケーション

<mx:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
           xmlns:s="library://ns.adobe.com/flex/spark" 
           xmlns:mx="library://ns.adobe.com/flex/mx" 
           minWidth="955" minHeight="600" creationComplete="onCreationComplete()">
<fx:Declarations>
    <!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>
<fx:Script>
    <![CDATA[
        import mx.collections.ArrayCollection;

        import spark.components.gridClasses.GridColumn;


        [Bindable]
        public static var initDG:ArrayCollection = new ArrayCollection([
            {label:"firstItem"}, {label:"secondItem"}, {label:"thirdItem"}

        ]); 


        protected function onCreationComplete():void {

            dataGrid.addEventListener(MyEvent.GET_SELECTED_INDEX, onRendererButtonClick, false, 0, true);
        }
        protected function onRendererButtonClick(ev:MyEvent):void {
            trace("Application::RenderButtonClick");
        }

    ]]>

</fx:Script>
<s:VGroup>
    <s:DataGrid id="dataGrid" verticalCenter="0" horizontalCenter="0"  dataProvider="{initDG}">
        <s:columns>
            <s:ArrayList>
                <s:GridColumn dataField="label" itemRenderer="renderers.ButtonDispatchItemRenderer"></s:GridColumn>                   
            </s:ArrayList>
        </s:columns>            
    </s:DataGrid>
</s:VGroup>

</mx:Application>

selectedIndex を保持するイベントにプロパティを追加する必要があります。そして、レンダラー内のイベントに値を渡す必要があります (たとえば、コンストラクターの 2 番目の引数)。この例では、イベントをディスパッチするだけです。

于 2013-05-10T13:53:51.037 に答える