簡體   English   中英

FLEX 3如何使列表項的選擇成為條件?

[英]FLEX 3 How do I make selection of a list item conditional?

FLEXBuilder 3獨立版,SDK 3.5

您好,我有一個帶有項目渲染器的List控件。 通過數據綁定,選擇列表中的項目會以表格形式顯示相應的數據集以進行編輯。 通過單擊“保存”按鈕可以更新更改。

如果對表單進行了更改但未保存,則我需要提示用戶是否嘗試移動到另一個列表項。 如果他們確認了提示,請移至他們單擊的項目,放棄所做的更改;否則,請留在原處,以便他們有機會單擊“保存”。

我已經嘗試過使用List的click事件上的偵聽器,也使用了preventDefault(),但是似乎沒有任何東西可以攔截更改所選項目的默認功能。

任何幫助將不勝感激。

您可以嘗試擴展List並覆蓋受保護的函數mouseDownHandler(event:MouseEvent):void 在那里,您可以通過某種邏輯來決定是調用super.mouseDownHandler(event)還是什么都不做:)

可能有一個更好的函數來覆蓋它,並且有一個更好的地方,但是我將這種想法留給您。

祝好運!

您可以嘗試以下方法:

  • 在捕獲階段防止鼠標按下事件
  • 無論如何都會發生Itemclick事件,因此只需記住單擊的項目索引並顯示確認對話框
  • 如有需要,請在驢友的密閉處理機中進行實際更改。

這是一個例子:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM