2010-06-24 57 views
2

我所擁有的是一個具有靜態屬性的類,我想用它作爲圖像。我希望圖像在運行時可以配置,但仍然有默認值。因此,圖像類的樣子:Actionscript中的DataBinding

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類中的屬性改爲別的東西。在MXML中定義的圖像將獲取綁定事件並更新圖像,但在ActionSctipt中創建的自定義組件不會被更新。

我的問題是爲什麼?我該如何解決它?

謝謝!

回答

1

從生成的代碼的外觀來看,它不值得試圖弄清楚AS如何做它的魔力。在這種情況下,最好的(最簡單)的選擇就是打開圖片,定義爲單是這樣的:

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"); 

感謝馬克西姆爲建議。

1

static變量使用特殊的魔法與生成的EventDispatcher-s和StaticPropertyWatcher進行綁定。如果您想深入瞭解,請添加-keep編譯器選項。

這就是爲什麼BindingUtils.bindSetter不起作用。

不確定你真的想知道如何使用bindind類來解決這個問題:)更容易的是綁定到Image實例。

+0

這是我考慮的事情,但爲什麼它會在MXML中工作? – Ryan 2010-06-25 11:48:02

+0

我編輯了答案,謝謝你的提問。 – 2010-06-25 12:27:13

+0

我想讓它們變爲靜態的原因是,圖像可能會在運行時發生變化,並且變化會在應用程序的所有部分中反映出來。所以我想解決方案是讓它成爲一個單身人士。 – Ryan 2010-06-25 14:06:18