FLEXBuilder 3独立版,SDK 3.5
您好, 我有一个带有项呈示器的List控件。通过数据绑定,列表中项目的选择以用于编辑的形式显示相应的数据集。单击“保存”按钮可以更新更改。
如果在表单中进行了更改但未保存,我需要提示用户是否尝试移动到另一个List项目。如果他们确认提示,请转到他们点击的项目,放弃他们的更改,如果没有,请保持原状,以便他们有机会点击“保存”。
我已尝试使用List的click事件上的Listener,也使用preventDefault(),但似乎没有任何内容拦截更改所选项目的默认功能。
非常感谢任何帮助。
答案 0 :(得分:0)
您可以尝试扩展List并覆盖受保护的函数mouseDownHandler(event:MouseEvent):void 。在那里你可以通过某种逻辑来决定是否调用 super.mouseDownHandler(事件)或者什么都不做:)
可能有一个更好的功能来覆盖和更好的地方,但我想离开这个想法。
祝你好运!答案 1 :(得分:0)
您可以尝试以下方法:
以下是一个例子:
<?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>