2010-06-06 10 views
5

Necesito enlazar dinámicamente las propiedades de los componentes creados en tiempo de ejecución. En este caso particular, asuma que necesito usar bindProperty.Conceptos básicos sobre la comprensión de datos dinámicos (bindPropety) En Flex

No entiendo por qué la siguiente prueba simplista está fallando (ver código). Cuando hago clic en el botón, el texto de la etiqueta no cambia.

Me doy cuenta de que hay formas más simples de llevar a cabo este ejemplo en particular utilizando el enlace tradicional no dinámico, pero tengo que entenderlo en términos de usar bindProperty.

¿Alguien puede ayudarme a entender lo que me estoy perdiendo?

<?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> 

Gracias de antemano.

Respuesta

3

Según lo mencionado por Glenn, debe agregar la etiqueta [Bindable] en Value.

Además, no ha definido un colocador para la propiedad. El enlace de datos se invoca solo cuando se llama al setter correspondiente. El flujo es algo así como: usted llama al colocador: Flex actualiza los datos llamando al captador.

[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"; 
    } 

Tenga en cuenta que he cambiado los nombres de funciones y propiedades a minúsculas según la convención normal. InitialCaps se usa solo para nombres de clase.

+0

Sí, parece que es porque me faltaba un método establecido. No me di cuenta de que era obligatorio. – Joshua

1

Nunca utilizo BindingUtils, pero mi primera suposición es que le falta la etiqueta [Bindable] en "Value".

Cuestiones relacionadas