我为我的问题准备了一个简化的测试案例。如果您将以下2个文件放入项目中,它将立即在您的Flash Builder中运行。
我试图在弹出窗口中显示字符串列表和确认复选框。 在真实的应用中,我会使用自定义事件来分发选定的字符串,但在下面的测试代码中,我只是调用trace(str); 我的问题是:如果我使用click事件,那么窗口会关闭,即使我点击滚动条(当前面有项目被选中时,!str检查无法帮助)。而如果我使用change事件,则在我第二次点击相同的项目时,窗口不会关闭。而spark.components.List中似乎没有itemClick事件。
请问如何处理这个经常出现的问题?
为每个项目编写一个自定义项渲染器,并具有单独的click事件处理程序,似乎对于这种情况过于繁琐,因为列表中有字符串。
Test.mxml:(请点击myBtn几次 - 查看我在click和change方面遇到的问题)
我试图在弹出窗口中显示字符串列表和确认复选框。 在真实的应用中,我会使用自定义事件来分发选定的字符串,但在下面的测试代码中,我只是调用trace(str); 我的问题是:如果我使用click事件,那么窗口会关闭,即使我点击滚动条(当前面有项目被选中时,!str检查无法帮助)。而如果我使用change事件,则在我第二次点击相同的项目时,窗口不会关闭。而spark.components.List中似乎没有itemClick事件。
请问如何处理这个经常出现的问题?
为每个项目编写一个自定义项渲染器,并具有单独的click事件处理程序,似乎对于这种情况过于繁琐,因为列表中有字符串。
Test.mxml:(请点击myBtn几次 - 查看我在click和change方面遇到的问题)
<?xml version="1.0" encoding="utf-8"?>
<s:Application
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
minWidth="400" minHeight="300">
<fx:Script>
<![CDATA[
import mx.managers.PopUpManager;
private var _popup:Popup = new Popup();
private function showPopup(event:MouseEvent):void {
PopUpManager.addPopUp(_popup, this, true);
PopUpManager.centerPopUp(_popup);
}
]]>
</fx:Script>
<s:Button id="myBtn" right="5" bottom="5"
label="Open window" click="showPopup(event)" />
</s:Application>
Popup.mxml:
<?xml version="1.0" encoding="utf-8"?>
<s:TitleWindow
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
width="240" height="240"
creationComplete="init(event)"
close="close()">
<fx:Script>
<![CDATA[
import mx.collections.ArrayList;
import mx.controls.Alert;
import mx.events.FlexEvent;
import mx.events.CloseEvent;
import mx.events.ItemClickEvent;
import mx.managers.PopUpManager;
private var myData:ArrayList = new ArrayList();
private function init(event:FlexEvent):void {
// XXX in the real app data is updated from server
myData.removeAll();
for (var i:uint = 1; i <= 10; i++)
myData.addItem('Item #' + i);
}
public function close(event:TimerEvent=null):void {
PopUpManager.removePopUp(this);
}
private function handleClick(event:MouseEvent):void {
var str:String = myList.selectedItem as String;
if (!str)
return;
if (myBox.selected) {
Alert.show(
'Select ' + str + '?',
null,
mx.controls.Alert.YES | mx.controls.Alert.NO,
null,
handleConfirm,
null,
mx.controls.Alert.NO
);
} else {
sendEvent();
}
}
private function handleConfirm(event:CloseEvent):void {
if (event.detail == mx.controls.Alert.YES)
sendEvent();
}
private function sendEvent():void {
close();
// XXX in the real app dispatchEvent() is called
trace('selected: ' + (myList.selectedItem as String));
}
]]>
</fx:Script>
<s:VGroup paddingLeft="20" paddingTop="20"
paddingRight="20" paddingBottom="20" gap="20"
width="100%" height="100%">
<s:List id="myList" dataProvider="{myData}"
click="handleClick(event)"
width="100%" height="100%" fontSize="24" />
<s:CheckBox id="myBox" label="Confirm" />
</s:VGroup>
</s:TitleWindow>
还有一个问题,为什么会收到上面的警告:
Data binding will not be able to detect assignments to "myData".