1

FLEXBuilder 3 独立版,SDK 3.5

您好,我有一个带有项目渲染器的列表控件。通过数据绑定,选择列表中的某一项,将对应的数据集以表格形式显示出来进行编辑。通过单击“保存”按钮更新更改。

如果在表单中进行了更改但未保存,我需要提示用户是否尝试移动到另一个列表项。如果他们确认提示,则转到他们单击的项目,放弃他们的更改,如果没有,则留在原处,以便他们有机会单击“保存”。

我已经尝试在列表的单击事件上使用监听器,也使用 preventDefault() 但似乎没有任何东西可以拦截更改所选项目的默认功能。

任何帮助将不胜感激。

4

2 回答 2

0

您可以尝试扩展 List 并覆盖受保护的函数 mouseDownHandler(event:MouseEvent):void。在那里你可以通过一些逻辑来决定是调用super.mouseDownHandler(event)还是什么都不做:)

可能有一个更好的功能可以覆盖和一个更好的地方,但我把这个想法留给你。

祝你好运!

于 2013-02-05T01:17:16.147 回答
0

您可以尝试以下方法:

  • 在捕获阶段防止鼠标按下事件
  • 无论如何都会发生 Itemclick 事件,因此请记住单击的项目索引并显示确认对话框
  • 如果需要,请在 alet's 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 回答