FLEX 3如何选择列表项有条件?

时间:2013-02-04 23:39:23

标签: actionscript-3 flex flex3

FLEXBuilder 3独立版,SDK 3.5

您好, 我有一个带有项呈示器的List控件。通过数据绑定,列表中项目的选择以用于编辑的形式显示相应的数据集。单击“保存”按钮可以更新更改。

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

我已尝试使用List的click事件上的Listener,也使用preventDefault(),但似乎没有任何内容拦截更改所选项目的默认功能。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

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

可能有一个更好的功能来覆盖和更好的地方,但我想离开这个想法。

祝你好运!

答案 1 :(得分:0)

您可以尝试以下方法:

  • 在捕获阶段防止鼠标停止事件
  • 无论如何都会发生Itemclick事件,所以请记住点击的项目 索引和显示确认对话框
  • 在alet的关闭处理程序中,如果需要,请执行实际更改。

以下是一个例子:

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