强制所有项呈示器都为commitProperties?

时间:2010-03-05 23:25:36

标签: flex datagrid itemrenderer

我有一个项目渲染器,用于检查外部源以获取显示信息。如果该信息发生变化,我想强制所有项目渲染器实例进行检查。

将列表或网格中的所有项目渲染器强制为commitProperties或执行其他方法的最佳方法是什么?

  • 我读过重置的 grid.itemRenderer属性将成为 他们都初始化。

  • 我也收到了建议 迭代遍历所有的迭代 网格的孩子并致电invalidateProperties 在我找到的所有UIComponents上。

有什么想法?替代?

3 个答案:

答案 0 :(得分:1)

请记住,在Flex列表中,您正在处理虚拟化和itemRenderer回收,因此通常只有当前可见的itemRenderer实际存在,因此实际上需要更新。

以下适用于基于Spark列表的控件:

for ( var i:int=0; i< sparkList.dataGroup.numElements; i++ )
            {
                var element:UIComponent = sparkList.dataGroup.getElementAt( i ) as UIComponent;
                if ( element )
                    element.invalidateProperties();
                else
                    trace("element " + i.toString() + " wasn't there");

            }

如果您有100个项目,这将更新10个可见项并忽略虚拟休息。

如果你正在使用mx DataGrid,你可能想尝试这个的变种 - 但它不使用DataGroup / Spark虚拟化,所以我没有找到你的答案。< / p>

P.S。我正在完成一个完全基于Spark的DataGrid,我会在完成后发布链接。

答案 1 :(得分:0)

Datagroup具有getItemIndicesInView(),它将为您提供视图中所有项呈示器的指示。用这些指标调用getElementAt。

我通常也会扩展ItemRenderer并添加以下内容,这将导致项呈示器的状态刷新。

   public function invalidateSkinState():void
   {
      super.invalidateRendererState();
   }

答案 2 :(得分:0)

    public function updateAllRenderer():void
    {
        if (!list.dataGroup)
            return;
        if (!list.dataGroup.dataProvider)
            return;

        for ( var index:int=0; index< list.dataGroup.numElements; index++ )
        {
            var item:Object = list.dataGroup.dataProvider.getItemAt(index);
            var renderer:IVisualElement = list.dataGroup.getElementAt( index ) as IVisualElement;
            if ( renderer )
                list.updateRenderer( renderer, index, item );
        }
    }

对我来说很好用