狗班级。请注意,狗不知道它的位置。从逻辑上讲,狗不应该知道它的位置。
public class Dog {
public var name:String;
public var age:Number;
}一个UI组件,在列表中显示所有的狗。有一种方法可以确定狗是否逃走了。
<?xml version="1.0" encoding="utf-8"?>
<s:VGroup ... >
<fx:Script>
<![CDATA[
[Bindable]
private var listDataProvider:ArrayCollection /* ArrayCollection of Dogs */
public var hasDogEscaped(dog:Dog):Boolean {
return ...;
}
]]>
</fx:Script>
<s:List id="list" dataProvider="{listDataProvider}" itemRenderer="DogItemRenderer"/>
</s:VGroup>一个项目渲染器,显示狗的名字,如果狗已经逃脱了狗的名字旁边的解释标记。
<?xml version="1.0" encoding="utf-8"?>
<s:ItemRenderer ...>
<s:Label text="{(data as dog).name}" verticalAlign="middle" height="100%"/>
<mx:Image id="dogEscaped"
visible="{???????????????????????????????????????.hasDogEscaped(data as Dog)}"
source="@Embed(source='/assets/icons/warning.png')"/>
</s:Group>
</s:ItemRenderer>我想要做的是让项目呈现器从项目呈现器调用hasDogEscaped方法,但我还不知道如何做到这一点。任何帮助都将不胜感激。
发布于 2012-01-20 05:18:44
我不会绑定到这个函数。不管怎么说,你不需要这样做。
override public function set data(value:Object):void{
if(value){
super.data = value;
dogEscaped.visible = yourFunction(data);
}
}现在,如果您希望将非静态版本的yourFunction传递到dataGrid中,则需要将其作为属性添加。为此,您需要使用ClassFactory将属性传递给您的itemRenderer。基本上看起来是这样的:
dogItemRenderer= new ClassFactory(DogIteMRenderer);
dogItemRenderer.properties = {dogEscapedFunction: dogEscapedFunction};
dogColumn.itemRenderer = dogItemRenderer;现在确保您的itemRenderer中有一个名为dogEscapedFunction的属性。
发布于 2012-01-20 03:21:48
简而言之,您需要在Dog类上添加一个isVisible属性。虽然狗不应该知道它的位置-它确实需要知道它是否可见。创建进入(和离开)项目渲染器的路径通常不是一个好主意。(如果这超出了Dog类的范围,那么您可以使用Adapter模式来包装现有类并添加额外的属性。)项目呈现器需要接收正确显示所呈现内容所需的所有数据。
您可以在定义s:List的MXML文件中设置此属性的值,然后覆盖项目渲染器上的set data方法,以确定Image是否应可见。
发布于 2012-01-20 05:26:55
项目呈现器仅用于显示您的数据,而不用于应用程序逻辑。
由于您的arrayCollection已经是可绑定的,因此您应该向它添加一个事件侦听器,以便在更改时调用hasDogEscaped。
https://stackoverflow.com/questions/8931849
复制相似问题