【发布时间】:2013-06-25 13:58:16
【问题描述】:
最近我注意到在为 gridColumn 使用 labelFunction 时出现了一个问题:
当嵌套(显示)属性更改时,它不会刷新。
// SomeClass and SomeSubClass has [Bindable] metadata
[Bindable]
private var someSubClass:SomeSubClass;
[Bindable]
private var someClass:SomeClass;
private function inits():void{
someSubClass = new SomeSubClass();
someSubClass.value = "SomeSubValue";
someClass = new SomeClass();
someClass.subclass = someSubClass;
var ac:ArrayCollection = new ArrayCollection();
ac.addItem(someClass);
dg.dataProvider = ac;
}
private function myLabelFunction(item:Object, column:GridColumn):String
{
return (item.subclass)? item.subclass.value : "";
}
mxml
<s:Button click="someSubClass.value = 'Hello World'"/>
<s:DataGrid dataProvider="{dataProvider}" width="100%" height="200">
<s:columns>
<s:ArrayList>
<s:GridColumn labelFunction="{myLabelFunction}" headerText="NoRenderer"/>
<s:GridColumn headerText="WithRenderer">
<s:itemRenderer>
<fx:Component>
<s:GridItemRenderer>
<s:Label text="{data.subclass.value}"/>
</s:GridItemRenderer>
</fx:Component>
</s:itemRenderer>
</s:gridColumn>
</s:ArrayList>
</s:columns>
</s:DataGrid>
当按钮单击使用 labelFunction 的第一列时仍然显示旧值,但第二列(使用自定义渲染器)工作正常。我正在尝试尽可能少地使用自定义项目渲染器来解决性能问题。还是我的标签功能有问题?
【问题讨论】:
-
有点摸不着头脑,但您是否尝试过将 myLabelFunction 标记为 [Bindable]?只要元素是使用 ArrayCollection 而不是它的底层源修改的,那么我相信它会触发刷新事件,如果您只是修改对象而不更新数组集合,它不会自动调度集合刷新事件。
-
是的,我做到了。我正在尝试 [Bindable] 和 [Bindable(event="propertyChange")] - 没有运气
-
虽然它可能并不理想,但您应该能够在通过调用 dg.invalidateList() stackoverflow.com/questions/74269/… 对数据进行更改后触发网格刷新,但这假设您有其他方法知道列表数据已被修改并可以从那里获取网格的句柄(可以使用单例,但有点乱)
-
@shaunhusain 方法不能被标记为可绑定,除非它们是 get set 方法。 labelFunction 上的 Bindable 不会有任何影响,尽管我可能会收到编译器警告。此外, labelFunction 没有改变。如果我不得不猜测——出于性能原因——渲染器不会重绘。不过,我敢打赌,如果您滚动,您会看到更新的值。尝试调用 dataProvider 上的 refresh() 或 itemUpdated() 方法。看来你已经在玩这个想法了。我不明白为什么那行不通。
-
@Reboog711 你是对的,感谢您的纠正,我的大脑最近一直处于 JavaScript/AngularJS 模式,所以我的 AS3/Flex 开始有点滑。
标签: actionscript-3 apache-flex air