2010-06-06 11 views
5

Ho bisogno di associare dinamicamente le proprietà dei componenti creati in fase di esecuzione. In questo caso particolare, si supponga di dover utilizzare bindProperty.No Understanding Nozioni di base su Dynamic DataBinding (bindPropety) in Flex

Non capisco perché il seguente test semplicistico stia fallendo (vedi codice). Quando clicco sul pulsante, il testo dell'etichetta non cambia.

Mi rendo conto che ci sono modi più semplici per andare su questo particolare esempio usando l'associazione tradizionale non dinamica, ma ho bisogno di capirlo in termini di utilizzo di bindProperty.

Qualcuno può aiutarmi a capire cosa mi manca?

<?xml version="1.0" encoding="utf-8"?> 
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" xmlns:ns1="Tools.*" minWidth="684" minHeight="484" xmlns:ns2="*" creationComplete="Init();"> 
    <mx:Script> 
    <![CDATA[ 
     import mx.collections.ArrayCollection; 
     import mx.binding.utils.*; 
     public var Available:ArrayCollection=new ArrayCollection(); 

     public function get Value():String { 
     return (Available.getItemAt(0).toString()); 
     } 

     public function Init():void { 
     Available.addItemAt('Before', 0); 
     BindingUtils.bindProperty(Lab, 'text', this, 'Value'); 
     } 

     public function Test():void { 
     Available.setItemAt('After', 0); 
     } 
    ]]> 
    </mx:Script> 
    <mx:Label x="142" y="51" id="Lab"/> 
    <mx:Button x="142" y="157" label="Button" click="Test();"/> 
</mx:WindowedApplication> 

Grazie in anticipo.

risposta

3

Come accennato da Glenn, è necessario aggiungere il tag [Bindable] su Value.

Inoltre, non è stato definito un setter per la proprietà. L'associazione dei dati viene invocata solo quando viene chiamato il setter corrispondente. Il flusso è qualcosa di simile: tu chiami il setter - Flex aggiorna i dati chiamando il getter.

[Bindable] 
    public function get value():String { 
    return (Available.getItemAt(0).toString()); 
    } 

    public function set value(v:String):void { 
    Available.setItemAt(v, 0); 
    } 

    public function init():void { 
    Available.addItemAt('Before', 0); 
    BindingUtils.bindProperty(Lab, 'text', this, 'Value'); 
    } 

    public function iest():void { 
    value = "After"; 
    } 

Nota che ho cambiato i nomi di funzioni e proprietà in minuscolo come per la convenzione normale. InitialCaps vengono utilizzati solo per i nomi di classe.

+0

Sì, sembra che mi mancasse un metodo set. Non avevo capito che era necessario. – Joshua

1

Non uso mai BindingUtils, ma la mia prima ipotesi è che manchi il tag [Bindable] su "Value".