List SelectionChanged上的updateDisplayList

时间:2014-08-12 16:22:51

标签: actionscript-3 flex mxml

我有一个名为AdvancedPanel的类,其头部中的按钮继承了Panel类,而AdvancedPanelSkin则执行PanelSkin类。 我在AdvancedPanel中有一个List,我想在列表中选择一个项目时启用一个按钮。

我已经将函数用于处理子皮肤类中重写的updateDisplayList()内部的启用和禁用,但是当我在List的changeHandler中放入invalidateDisplayList()调用时,它不会被调用。 这是我的代码的相对部分:

//AdvancedPanelSkin.as
//..
override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void
{
    super.updateDisplayList(unscaledWidth, unscaledHeight);
    addBtn.enabled = _hostComponent_.addButtonEnabled;
    removeBtn.enabled = _hostComponent_.removeButtonEnabled;  
}
//..

//form.mxml
//..
<fx:Script>
    <![CDATA[
        //...
        protected function list_changeHandler(event:IndexChangeEvent):void
        {
            panel.invalidateDisplayList(); // <- It doesn't call updateDisplayList() on AdvancedPanelSkin
        }
    ]]>
</fx:Script>
<components:AdvancedPanel id="panel" addButtonEnabled="true" removeButtonEnabled="{list.selectedIndex != -1}">
    <s:List id="list"
        //..
        change="list_changeHandler(event)"
    </s:List>   
</components:AdvancedPanel>
//..

我错过了什么吗?

提前致谢。

1 个答案:

答案 0 :(得分:1)

使面板的显示列表无效不会导致其外观的显示列表无效。在意识形态上正确的是通过除皮肤组分之外的皮肤部分来控制来自宿主成分的皮肤。因此,将按钮添加到面板作为外观部件,并覆盖面板的updateDisplayList,而不是其外观。

<强> AdvancedPanel.as

[SkinPart]
public var addBtn:Button;
[SkinPart]
public var removeBtn:Button;

override public function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void {
        addBtn.enabled = ...;
        removeBtn.enabled = ...;
}