2011-05-20 73 views
1

我有Class1一個名爲age只讀綁定屬性:做一個包裹屬性可綁定

public class Class1 { 
    private var _age:int; 

    [Bindable(event="ageChanged"] 
    public function get age():int { 
    return this._age; 
    } 

    public function something():void { 
    _age++; 
    dispatchEvent(new Event("ageChanged")); 
    } 
} 

我也有Class2其中包含的Class1一個私有的實例。而且我想讓從Class1可用,仍然可以綁定。

public class Class2 { 
    private var c1:Class1 = new Class1(); 

    [Bindable????] 
    public function get age():int { 
    } 
} 

當然[Bindable]標記沒有意義。但我怎樣才能達到同樣的效果?

我相信我可以從Class2派遣某種ageChanged事件高達Class1,然後在Class1派遣另一個地方ageChanged事件的事件處理程序,而我綁定Class2age財產。

但這聽起來不必要的複雜。沒有更簡單的方法嗎? :)

謝謝!

回答

1

就個人而言,我只是把我的組合類公共和從視圖訪問它,如果它是一個模型(我認爲這是)。如果你不想做,你可以隨時使用BindingUtils

在類的構造函數2

var watcher:ChangeWatcher = BindingUtils.bindProperty(this, 'age', c1, 'age'); 
+0

啊!謝謝@J_A_X!這非常接近我尋找的魔法。這樣內部類不需要通過事件與外部類進行明確的通信。謝謝!實施並正常工作。實際上這個討論非常有用,它使我更加意識到BindingUtils,因爲我在MXML中完成所有綁定,所以我傾向於忘記它。 – nununo 2011-05-20 17:35:04

+0

使內部類公開是不可能的,因爲外部類是處理認證的類。這將是一個安全漏洞:) – nununo 2011-05-20 17:35:53

2

嘗試使用類似:

public class Class2 extends EventDispatcher { 
private var _c1:Class1; 

public function set c1(value:Class1):void 
{ 
    if (value == _c1) 
    return; 
    if (_c1) 
    _c1.removeEventListener("ageChanged", ageChangedHandler); 
    _c1 = value; 
    if (_c1) 
    _c1.addEventListener("ageChanged", ageChangedHandler); 
} 

private function ageChangedHandler(event:Event):void 
{ 
    dispatchEvent(new Event("ageChanged")); 
} 

    [Bindable("ageChanged")] 
    public function get age():int { 
    } 
} 
+0

我希望有一個更簡單的神奇的解決方案,我可以避免額外的事件。但是...魔法不存在:)所以我實現了你的建議。謝謝;) – nununo 2011-05-20 16:24:28

+0

綁定是關於事件。如果你不會手動生成事件,'mxmlc'編譯器會在代碼生成過程中執行它。所以沒有機會避免處理綁定的事件。 – Constantiner 2011-05-20 16:28:17

+0

實際上,J_A_X在那裏提出了建議,並且我更喜歡其他選擇,因爲它不需要內部類將事件明確地發送到外部。這樣,兩個類都通過純綁定機制進行通信,並且不需要額外的事件。不管怎麼說,還是要謝謝你! – nununo 2011-05-20 17:34:15