为MXItemRenderer添加自定义状态

MXItemRenderer是专为MX DataGrid、MX AdvancedDataGrid及MX Tree这类MX组件提供Spark项目渲染器的基类。与其它Spark渲染器一样,它有normal、 hovered、selected和dragging等状态。但在项目渲染器中添加了自定义状态后,默认状态会覆盖原有状态,保留不了新增状态,因而会出现项目渲染器界面错乱的问题(如实例中第一个MX DataGrid)。怎么解决这一个问题呢?

首先要找到问题所在,幸好Flex SDK是开源的,我们可以很方便地查看源码。打开ItemRenderer.as,找到getCurrentRendererState()方法。查看其注释,提到很重要的一点:如果所需的行为与默认行为不同,则ItemRenderer的子类必须覆盖此方法以返回值。再查看ItemRenderer子类MXAdvancedDataGridItemRenderer和MXItemRenderer的源码,根本就没有getCurrentRendererState()重载该方法。这就导致在MX DataGrid和MX AdvancedDataGrid添加项目渲染器状态会出问题。但在Spark组件中添加状态没有这个问题,因为它们用的是ItemRenderer基类。

明白了这个原理,问题也就迎刃而解了。在自定义的渲染器组件中添加如下面的代码:

override protected function getCurrentRendererState():String
{
  return currentState;
}

为什么不加上返回默认状态的代码呢?那是因为项目渲染器的子类会继承父类的状态,因此返回currentState的值其实已经包含了返回默认状态值,当然也包括了新增的自定义状态值。

点击此处查看该实例最终效果,点击此处下载该实例的源码。

使用MXItemRenderer主要是为了兼容MX组件,建议尽量使用相应的Spark组件来代替。当然对于MX AdvancedDataGrid和MX Tree,大家也不用太担心,这个问题只在Flex 4.0/4.1中存在,Flex 4.5及其以上版本已经重写了ItemRenderer类,不存在这个问题。

发表评论