[英]Flex ItemRenderer Example Troubles, what am I doing wrong
希望帮助我的人您好。
我正在尝试实现此示例: http : //ramblingdeveloper.com/ramblings/2011/9/24/creating-a-flex-spark-list-of-checkbox-bound-to-xml-dataprov.html
我的示例完全相同,但有一些小差异,因此我相应地修改了整个代码。
我的MXML应用程序:
<?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="955" minHeight="600">
<fx:Declarations>
<fx:XML format="e4x" id="namesXML">
<people>
<person>
<name>Leon</name>
</person>
<person>
<name>Mathilda</name>
</person>
<person>
<name>Stansfield</name>
</person>
<person>
<name>Benny</name>
</person>
</people>
</fx:XML>
<!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>
<fx:Script>
<![CDATA[
import mx.collections.XMLListCollection;
var temp:XMLListCollection = new XMLListCollection(namesXML.children());
]]>
</fx:Script>
<s:List itemRenderer="CheckBoxItemRenderer"
dataProvider="{temp}"/>
和我的MXML ItemRenderer:
<?xml version="1.0" encoding="utf-8"?>
<s:ItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
autoDrawBackground="true">
<s:CheckBox label="{data.person.name}"/>
</s:ItemRenderer>
我一直在获取Null对象引用,并且一直在弄乱我认为问题出在哪里:
<s:CheckBox label="{data.person.name}"/>
这就是我访问XML数据的方式,但是我不确定100%,因为XML和XML遍历并不是我的强项。 在我坐下并不断调整以取得突破时,任何细微的见解都会有所帮助。
编辑:修复了ItemRenderer代码,缺少结束标记。 编辑#2:我的ItemRenderer文件的名称是CheckBoxItemRenderer,如示例所示。
这不是一个答案。 但太大了,无法发表评论。 帮助调试; 代替在ItemRenderer中使用Binding,而使用dataChange事件:
<s:ItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
autoDrawBackground="true" dataChange="onDataChange()>
<fx:Script>
<[[
protected function onDataChange():void{
// if data isn't defined; just perform a return here
if(!data){ return }
// try a lot of traces to see what comes out
trace(data);
trace(data.name);
trace(data.person);
trace(data.person.name);
// etc.,. etc..
var checkBoxLabel :String = data.person.name;
check.label = checkBoxLabel;
}
]]>
</fx:Script>
<s:CheckBox id="check" />
</s:ItemRenderer>
我也不是XML解析专家。 我发现Flash Builder Debug面板中的watch变量在向下钻取XML方面不一致/无益; 因此,跟踪语句是必经之路。
如果我不得不猜测; 数据等于一个人,如下所示:
<person>
<name>Benny</name>
</person>
因此,执行data.person可能是多余的,并且尝试深入挖掘得太深,从而导致空值。 data.name似乎更有可能; 在我脑海里。
部分答案-由于namesXML是在<fx:Declarations>部分中声明的,因此它是主应用程序的子级,并且直到以后(创建所有子级时)才实例化。
如果要保留namesXML的定义,建议在那时添加creationComplete处理程序并设置temp:
<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"
creationComplete="doInit()">
<fx:Script>
<![CDATA[
import mx.collections.XMLListCollection;
var temp:XMLListCollection;
protected function doInit():void {
temp = new XMLListCollection(namesXML.children());
}
]]>
</fx:Script>
另一个问题是,需要将temp标记为Bindable-否则,当设置为temp时,所做的更改不会导致列表重新显示。
最后,temp中的XMLNode项目已经是人员节点,因此您只需要在项目渲染器中指定data.name即可:
<?xml version="1.0" encoding="utf-8"?>
<s:ItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
autoDrawBackground="true">
<s:CheckBox label="{data.name}"/>
</s:ItemRenderer>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.