【问题标题】:Adobe Flex 4.5 Spark: Binding ItemRenderer Component to ParentAdobe Flex 4.5 Spark:将 ItemRenderer 组件绑定到父级
【发布时间】:2011-10-04 16:49:39
【问题描述】:

在 Flex 3 中,过去可以通过 outerDocument 在 itemRenderer 中绑定组件属性。因此,例如,如果 itemRenderer 中的图像仅在父级的给定条件下显示,则这样的事情会完美地工作:

<mx:itemRenderer>
 <mx:Component>
   <mx:Label text="{data}"/>
   <mx:Image id="img" visible="{outerDocument.ShowImage}" includeInLayout="{outerDocument.ShowImage}"/>
</mx:Component>
</mx:itemRenderer>

外部文档(不是列表,而是列表所在的 mxml)包含类似的内容

[Bindable]
public function get ShowImage():void
{
return showImage;
}
public function set ShowImage(val:Boolean):void
{
showImage = val;
}

我尝试在 Flex 4.5 中使用使用 parentDocument 的 Spark 项目渲染器做同样的事情,但它似乎不知道绑定。当我在 Flex 4.5 中执行此操作时,itemRenderer 似乎不知道 parentDocument ShowImage 何时更改。

有没有人看到这个问题并能够提供解决方案?

编辑:添加 Spark 源 根据要求,这里是我的火花源:

MyItemRenderer.mxml

<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">
<s:Label id="myLabel" text="{data}/>
<s:Image src="something.png" visible="{parentDocument.ShowImage}" includeInLayout="{parentDocument.ShowImage}"/>
</s:ItemRenderer>

渲染容器.mxml

<s:Panel xmlns:fx="http://ns.adobe.com/mxml/2009" 
         xmlns:s="library://ns.adobe.com/flex/spark" 
         xmlns:mx="library://ns.adobe.com/flex/mx">
<fx:Script>
<![CDATA[

private var showImage:Boolean = false;

[Bindable]
public function set ShowImage(val:Boolean):void
{
     showImage = val;
}
public function get ShowImage():Boolean
{
     return showImage;
}
]]>
    </fx:Script>
    <!-- Content Group -->
    <s:List id="lstCell" width="100%" height="100%" itemRenderer="MyItemRenderer">      
    </s:List>
</s:Panel>

好的,所以在 RendererContainer.mxml 之外的包装器中有一个复选框,它调度通过更改可绑定布尔值来处理的自定义事件。然后,该 var 中的更改会更改我的 RendererContainer 组件上的 ShowImage 属性。我希望绑定会被 MyItemRenderer 拾取,但它似乎不起作用。

所以我的外包装会像这样访问 ShowImage

<comp:RendererContainer id="myId" ShowImage="{myCheckbox.selected}"/>

【问题讨论】:

  • 显示 4.5 示例的代码。
  • 通常要使某些东西可绑定,您需要在可绑定元数据标记中指定一个事件并从 set 方法调度该事件。那就是说你有错误吗?或者 itemRenderer 中的值没有改变?
  • 没有错误。 itemRenderer 只是没有更新。基本上,我有一个“控制面板”,其中包含可以在 itemRenderer 中显示的选项。控制面板只有一个复选框,用于在值更改时调度事件。该事件的处理程序会更新属性 ShowImage(标记为 Bindable),但是当我切换复选框时,我根本看不到图像在 itemrenderer 中出现或消失。我将发布 4.5 的代码

标签: apache-flex flex4.5 itemrenderer flex-spark


【解决方案1】:

我认为这应该对你有用,YourTypeHere 将是包含的类 对象,请确保 ShowImage 属性是公共的且可绑定的。

<mx:itemRenderer>
     <mx:Component> 
     <mx:Script>
        <![CDATA[ 
            import YourTypeHere;
        ]]>
    </mx:Script>
       <mx:Label text="{data}"/>
       <mx:Image id="img" 
        visible="{YourTypeHere(this.parent.ShowImage)}" 
        includeInLayout="{YourTypeHere(this.parent.ShowImage)}"/>
    </mx:Component>
</mx:itemRenderer>

附:请不要以大写字母开头的属性命名,包括 getter,考虑将其命名为 showImage 并将您的私有变量命名为 _showImage 之类的名称:D

【讨论】:

  • 这没有任何作用。我在 Flex 3 中有这个工作。这个想法是让绑定在 4.5 spark 中工作。
【解决方案2】:

您的 getter 似乎返回类型为 void。将其更改为布尔值

[Bindable]
public function get ShowImage():Boolean
{
return showImage;
}
public function set ShowImage(val:Boolean):void
{
showImage = val;
}

【讨论】:

  • 如果是真的,我认为会有编译时错误。
  • +1 表示收获。不过,我不确定这是“真正的”代码问题还是原始海报中的剪切和粘贴错误。
  • +1 @Ranhiru - 是的,你会在 getter 上得到一个 void 的编译器错误:)
【解决方案3】:

这会有所帮助。

<s:Image src="something.png" visible="{RendererContainer(ListSkin(parentDocument).parentDocument).ShowImage}" includeInLayout="{RendererContainer(ListSkin(parentDocument).parentDocument).ShowImage}"/>

【讨论】:

  • 奇怪。使用了你的资源,它对我有用。无论如何,尝试通过调试查看什么是 parentDocument。您的绑定不起作用,因为 parentDocument 不是 RendererContainer 并且使用 mxml 中的绑定时 flex 不会抛出异常。
【解决方案4】:

以下工作非常好:

<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" 
                       xmlns:s="library://ns.adobe.com/flex/spark" 
                       xmlns:mx="library://ns.adobe.com/flex/mx">
    <s:layout>
        <s:VerticalLayout/>
    </s:layout>
    <fx:Script>
        <![CDATA[
            import mx.collections.ArrayCollection;
        ]]>
    </fx:Script>
    <fx:Declarations>
        <!-- Place non-visual elements (e.g., services, value objects) here -->
    </fx:Declarations>
    <s:Panel xmlns:fx="http://ns.adobe.com/mxml/2009" 
             xmlns:s="library://ns.adobe.com/flex/spark" 
             xmlns:mx="library://ns.adobe.com/flex/mx">
        <s:layout>
            <s:VerticalLayout/>
        </s:layout>
        <fx:Script>
            <![CDATA[

                private var showImage:Boolean = false;

                [Bindable]
                public function set ShowImage(val:Boolean):void
                {
                    showImage = val;
                }
                public function get ShowImage():Boolean
                {
                    return showImage;
                }
            ]]>
        </fx:Script>
        <s:CheckBox label="Select" change="{ShowImage = !ShowImage}"/>
        <!-- Content Group -->
        <s:List id="lstCell" width="100%" height="100%" dataProvider="{new ArrayCollection(['A','B'])}">
            <s:itemRenderer>
                <fx:Component>
                    <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:layout>
                            <s:HorizontalLayout/>
                        </s:layout>
                        <s:Label id="myLabel" text="{data}"/>
                        <s:Button label="something.png" visible="{outerDocument.ShowImage}" includeInLayout="{outerDocument.ShowImage}"/>
                    </s:ItemRenderer>
                </fx:Component>
            </s:itemRenderer>
        </s:List>
    </s:Panel>

</s:WindowedApplication>

【讨论】:

  • 不幸的是,如上所示,itemrenderer 是在一个单独的类中而不是内联的,所以这不起作用。
  • 我再次对此进行了测试,以确保我没有错过任何东西并且绑定仍然没有发生。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2012-04-18
  • 1970-01-01
  • 1970-01-01
  • 2013-03-01
  • 1970-01-01
  • 2017-03-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多