繁体   English   中英

Flex ItemRenderer示例问题,我在做什么错

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM