Как динамически обновить свойство mxml во Flex? - PullRequest
0 голосов
/ 29 сентября 2011

Я использую Flex 4.0 с темой Halo и пользовательским компонентом, источником которого я являюсь.Я хочу вызвать компонент с параметром, чтобы скрыть или показать некоторые элементы.Параметр является динамическим, то есть он устанавливается в методе после загрузки mxml.

Фрагмент:

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
    layout="absolute"
    xmlns:ns1="de.aggro.components.*"
    width="100%"
    height="100%"
    initialize="init();"
>

<mx:Script>
    <![CDATA[
        [Bindable]
        public var allowwindowmanipulation:Boolean = true;

        internal function init():void {
            allowwindowmanipulation = false;
        }
    ]]>
</mx:Script>
<mx:states>
    <mx:State name="st">
        ...
        <ns1:CollapsableTitleWindow width="956" height="395" x="294" y="484" id="wnd" title="title" allowClose="{allowwindowmanipulation}">
    </mx:State>
</mx:states>

</mx:Application>

Код CollapsableTitleWindow (фрагмент):

public class CollapsableTitleWindow extends Panel implements ICTWindow {    
    public var allowClose:Boolean = true;

    function CollapsableTitleWindow(){
        super();
        addEventListener(FlexEvent.CREATION_COMPLETE, initializeHandler);
    }

    protected override function createChildren():void{
        super.createChildren();         

        //Create the Buttons
        closeButton = new Sprite();

        if(allowClose==true){
            titleBar.addChild(closeButton);
            drawCloseButton(true);
        }
    }
}

Теперь, когда я запускаю этот код, значение, присвоенное конструктору CollapsableTitleWindow, равно true для переменной allowClose.Поэтому, когда вызывается createChildren(), кнопка рисуется.

Как я могу изменить поведение?Я не возражаю, если кнопка сначала будет прорисована, а затем будет удалена, если это необходимо, но я не знаю, как мне выполнить эту привязку значений параметров.

Когда я, например, изменяю titleдля свойства {allowClose} отображается логическое значение false, хотя, вероятно, сначала передается true.

1 Ответ

1 голос
/ 29 сентября 2011

Примечание: отредактировано для отражения обратной связи

Поскольку вы используете Flex 4, вам, вероятно, следует делать это со скином и состояниями внутри скина.Но если вы хотите сделать это с помощью кода, попробуйте что-то вроде этого:

protected var _allowClose:Boolean=true;
protected var _allowCloseChanged::Boolean=true;
protected var _closeButton:Sprite = new Sprite();


public function get allowClose():Boolean {
    return _allowClose;
}

public function set allowClose(value:Boolean):void {
    if (value != _allowClose) {
       _allowClose=value;
       _allowCloseChanged=true;
       invalidateProperties();
    }
}

override protected function commitProperties():void {
   if (_allowCloseChanged) {
       if (_allowClosed) {
            titlebar.addChild(_closeButton);
            drawCloseButton(true);
       } else {
            titleBar.removeChild(_closeButton);
       }
       //you need to set this back false...sorry I left that out
       _allowCloseChanged=false;
   }
   super.commitProperties();
}

Примечание: в этом случае вам больше не нужно переопределять createChildren

...