0

你好,谁愿意帮助我。

我正在尝试实现这个例子: 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>

我不断得到一个空对象引用,并且一直在搞乱我认为问题出在哪里:

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

这就是我访问 XML 数据的方式,但我不能 100% 确定,因为 XML 和 XML 遍历不是我的强项。当我坐下来不断调整它以获得突破时,任何小的洞察力都会有所帮助。

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

4

2 回答 2

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 调试面板中的观察变量不一致/无助于深入研究 XML;所以跟踪语句是要走的路。

如果我不得不猜测;数据等于一个人,如下所示:

<person>
    <name>Benny</name>
</person>

因此,执行 data.person 可能是多余的,并试图深入挖掘导致空值。data.name 似乎更有可能;在我脑海里。

于 2013-05-03T17:37:32.697 回答
0

部分答案 - 由于 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 - 否则,当它被设置时,更改不会导致 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>
于 2013-05-03T20:44:35.630 回答