Flex ItemRenderer示例麻烦,我做错了什么

时间:2013-05-03 17:00:01

标签: flash flex actionscript checkbox itemrenderer

欢迎任何希望帮助我的人。

我正在尝试实现此示例: 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 Object Reference并且一直在搞乱我认为问题所在:

<s:CheckBox label="{data.person.name}"/>

我正在访问我的XML数据,但我不是100%肯定,因为XML和XML遍历不是我最强的观点。任何小小的见解都有助于我坐下来不断调整它以获得突破。

编辑:修正了ItemRenderer代码,缺少结束标记。 编辑#2:我的ItemRenderer文件的名称是CheckBoxItemRenderer,就像示例所示。

2 个答案:

答案 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>