2011-05-20 57 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