Actionscript中的DataBinding

时间:2010-06-24 14:04:31

标签: actionscript-3 binding flex4

我所拥有的是具有静态属性的类,我想将其用作图像。我希望这些图像可以在运行时配置,但仍然具有默认值。所以Images类看起来像:

package {
public class Images {

[Embed(source="/assets/Green-Light.gif")]
[Bindable]
public static var GreenLight:Class;
}
}

现在是一个自定义组件:

package {
import mx.binding.utils.BindingUtils;
import mx.controls.Image;

import spark.components.HGroup;

public class MyComp extends HGroup {
    private var _image:Image;

    public function MyComp() {
        _image = new Image();
        _image.source = Images.GreenLight;
        addElement(_image);
        BindingUtils.bindSetter(setImageIcon, Images, "GreenLight");
    }

    private function setImageIcon(newIcon:Class):void {
        trace(newIcon);
        _image.source = newIcon;
    }
}
}

现在,如果我创建一个这样的应用程序:

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
           xmlns:s="library://ns.adobe.com/flex/spark"
           xmlns:mx="library://ns.adobe.com/flex/mx"
           minWidth="955"
           minHeight="600"
           xmlns:ns1="*">
<fx:Script>
    <![CDATA[
        [Embed(source="/assets/Yellow-Light.gif")]
        [Bindable]
        public var YellowLight:Class;
    ]]>
</fx:Script>
<mx:Image source="{Images.GreenLight}"/>
<s:Button x="10"
          y="40"
          label="Button"
          click="Images.GreenLight=YellowLight"/>
<ns1:MyComp x="40" y="0"/>
</s:Application>

单击该按钮会将Images类中的static属性更改为其他内容。 MXML中定义的图像将获取绑定事件并更新图像,但不会更新在ActionSctipt中创建的自定义组件。

我的问题是为什么?以及如何修复它?

谢谢!

2 个答案:

答案 0 :(得分:1)

static变量可以使用生成的EventDispatcher - s和StaticPropertyWatcher的特殊魔法进行绑定。如果您想深入了解此问题,请添加-keep编译器选项。

这就是为什么BindingUtils.bindSetter不起作用的原因。

不确定您是否真的想知道如何使用bindind类修复此问题:)更容易绑定到Image实例。

答案 1 :(得分:1)

从生成的代码的外观来看,不值得试图弄清楚AS是如何做到的。在这种情况下,最好(最简单)的选项就是将Images类转换为像这样的单例:

package   {

public class Images {
    private static var _self:Images;
    public static function getInstance():Images {
        if(_self == null) {
            _self = new Images();
        }
        return _self;
    }
    [Embed(source="/assets/Green-Light.gif")]
    [Bindable]
    public var GreenLight:Class;
}
}

MyComp类将执行绑定,如:

BindingUtils.bindSetter(setImageIcon, Images.getInstance(), "GreenLight");

感谢Maxim的建议。