1

FLEXBuilder 3スタンドアロン、SDK 3.5

こんにちは、アイテムレンダラーを備えたリストコントロールがあります。データバインディングを介して、リスト内の項目を選択すると、対応するデータセットが編集用のフォームに表示されます。[保存]ボタンをクリックすると、変更が更新されます。

フォームに変更が加えられたが保存されていない場合、ユーザーが別のリストアイテムに移動しようとした場合は、ユーザーにプロンプ​​トを表示する必要があります。プロンプトを確認したら、クリックしたアイテムに移動し、変更を破棄します。そうでない場合は、「保存」をクリックする機会があるように、現在の場所にとどまります。

リストのクリックイベントでリスナーを試してみましたが、preventDefault()も使用しましたが、選択したアイテムを変更するデフォルトの機能を妨げるものは何もないようです。

どんな助けでも大歓迎です。

4

2 に答える 2

0

次のアプローチを試すことができます。

  • キャプチャ フェーズでのマウス ダウン イベントを防止する
  • とにかくItemclickイベントが発生するので、クリックされたアイテムのインデックスを覚えて確認ダイアログを表示するだけです
  • alet の close ハンドラーで、必要に応じて実際の変更を行います。

次に例を示します。

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" minWidth="955" minHeight="600"
            creationComplete="application1_creationCompleteHandler(event)"
            >
<mx:Script>
    <![CDATA[
        import mx.controls.Alert;
        import mx.events.CloseEvent;
        import mx.events.FlexEvent;
        import mx.events.ListEvent;

        [Bindable]
        private var formDirty:Boolean = false;              

        protected function application1_creationCompleteHandler(event:FlexEvent):void
        {
            myList.addEventListener(MouseEvent.MOUSE_DOWN, myList_mouseDownHandler, true);  
        }           


        protected function myList_mouseDownHandler(event:MouseEvent):void
        {
            if (formDirty)
            {
                event.preventDefault();
                event.stopImmediatePropagation();
            }
        }

        protected function myList_itemClickHandler(event:ListEvent):void
        {
            if (formDirty)
            {
                var alert:Alert  = Alert.show("Save changes?", "Confirm save", Alert.YES | Alert.NO | Alert.CANCEL, null, alertCloseHandler);
                alert.data = event.rowIndex;
            }
        }

        private function alertCloseHandler(evt:CloseEvent):void
        {
            var alert:Alert = evt.target as Alert;
            switch (evt.detail)
            {
                case Alert.YES:
                    //Save changes
                    //
                    // Whatever....
                    //
                case Alert.NO: 
                    //manually change list index cahnge
                    // we also fall here from Alert.Yes case
                    formDirty = false;
                    myList.selectedIndex = alert.data as int;
                    break;
                case Alert.CANCEL:
                    //Do notthing:
                    break;
            }                   
        }           


        protected function invalidateButton_clickHandler(event:MouseEvent):void
        {
            formDirty = true;   
        }

    ]]>
</mx:Script>
<mx:VBox>
    <mx:List id="myList" itemClick="myList_itemClickHandler(event)">
        <mx:dataProvider>
            <mx:ArrayCollection>
                <mx:String>Item 0</mx:String>
                <mx:String>Item 1</mx:String>
                <mx:String>Item 2</mx:String>
                <mx:String>Item 3</mx:String>
                <mx:String>Item 4</mx:String>
            </mx:ArrayCollection>
        </mx:dataProvider>
    </mx:List>
    <mx:Button id="invalidateButton" click="invalidateButton_clickHandler(event)"  label="{formDirty?'Invalidated':'Invalidate form'}" enabled="{formDirty?false:true}"/>
</mx:VBox>

于 2013-02-05T08:40:05.793 に答える
0

リストを拡張して、保護された関数 mouseDownHandler(event:MouseEvent):voidをオーバーライドすることができます。そこで、 super.mouseDownHandler(event)を呼び出すか、何もしないかをロジックによって決定できます:)

おそらく、オーバーライドするためのより良い機能とそのためのより良い場所がありますが、それはあなたに任せています。

幸運を!

于 2013-02-05T01:17:16.147 に答える