欢迎任何希望帮助我的人。
我的例子与一些小的差异相同,我相应地修改了整个代码。
我的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 Object Reference并且一直在搞乱我认为问题所在:
<s:CheckBox label="{data.person.name}"/>
我正在访问我的XML数据,但我不是100%肯定,因为XML和XML遍历不是我最强的观点。任何小小的见解都有助于我坐下来不断调整它以获得突破。
编辑:修正了ItemRenderer代码,缺少结束标记。 编辑#2:我的ItemRenderer文件的名称是CheckBoxItemRenderer,就像示例所示。
答案 0 :(得分:0)
这不是一个很好的答案;但这个评论太大了。帮助调试;而不是在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面板中的监视变量在深入研究XML时不一致/无用;所以跟踪陈述是要走的路。
如果我不得不猜测;数据等于一个人,如下所示:
<person>
<name>Benny</name>
</person>
因此,执行data.person可能是多余的,并尝试向下钻取太多而导致null值。 data.name似乎更有可能;在我的脑海里。
答案 1 :(得分:0)
部分答案 - 因为namesXML是在&lt; fx:Declarations&gt;中声明的。 section,它是主应用程序的子代,直到稍后(当创建所有子代时)才会实例化。
如果你想保留你定义的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 - 否则,当它被设置时,更改不会导致List重新显示。
最后,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>