Domanda

Ho una classe modello vinturabile (chiamiamolo myModel) con due proprietà, etichetta e valore. Il valore viene aggiornato frequentemente, quindi è contrassegnato come vincoli. Funziona bene finora, i dati vengono aggiornati e l'evento di modifica della proprietà standard viene spedito.

Ora devo fare un ArrayCollection dalle istanze dell'oggetto di questo modello per utilizzarlo come fornitore di dati in un gruppo di dati. I dati vengono quindi passati a un elementoRender personalizzato in cui accedo alle proprietà MyModel tramite data.Label e Data.Value.

L'unico problema che ho ora è che la proprietà del valore myModel non cambia più (suppongo che perché ho memorizzato gli oggetti nella matrice ArrayCollection).

L'ArrayCollection è contrassegnabile anche in btw, poiché durante il runtime possono essere aggiunte nuove istanze di oggetti di MyModel.

C'è un modo per far funzionare questo? Qualsiasi aiuto al riguardo sarebbe molto apprezzato!

EDIT: ho quasi dimenticato, l'oggetto valore nella classe MyModel è aggiornato da un'altra classe vincolabile. Sì, lo so che sono i pazzi, ma è per questo che sono qui, per ottenere qualche input su un modo più semplice (e effettivamente funzionante) per risolvere questo problema.

2a modifica: tutti i ragazzi, un po 'di codice per illustrare il problema;

Cominciamo con la prima classe vinturabile;

[Bindable]
public class FirstClass
{
   public var name:String;
   public var firstValue:Number;
   public var secondValue:Number;
   public var thirdValue:Number;

   public function FirstClass()
   { }
 }

I valori (dal primo al terzo) vengono aggiornati da una classe controller. Fin qui tutto bene. Ora alla seconda classe modello (per questioni di coerenza, manteniamo il nome Myclass)

[Bindable]
public class MyClass
{
   public var label:String;
   public var value:Number;

   public function FirstClass()
   { }
 }

Queste sono le due classi di modelli. Background dietro questo è che ho bisogno di un valore di stringa (un'etichetta) per ogni proprietà di un'istanza di Firstclass. Vorrei renderlo più semplice, quindi non sono davvero sistemato su questa "soluzione" tosse ;).

Comunque, abbiamo i due modelli, ora alla mia classe .MXML;

[Bindable] private var firstClassInstance:FirstClass;

Creo un nuovo ArrayCollection e aggiungo oggetti come questo; myArrayCollection.Additem (new Myclass ("This Is A Label", FirstClassInstance.FirstValue));

E ancora, DataGroup utilizza questo ArrayCollection come fornitore di dati.

Come abbiamo già stabilito (grazie @windowns), l'ArrayCollection sembra solo per gli oggetti aggiunti o rimossi, non le modifiche alla proprietà di questi oggetti.

È stato utile?

Soluzione 4

Ho preso i consigli di Amy e ho studiato un po 'di più sul metodo degli articoli. Si scopre che la soluzione era proprio lì.

Vedere qui: http://flex4examples.wordpress.com/2009/08/28/1st/

Ho applicato questa metodologia (con poche varianti) al mio codice e funziona abbastanza bene. Le prestazioni su iPad2 sono buone, così come l'utilizzo della memoria del mio componente.

Speriamo che anche Amy stia bene con questa soluzione. Dita incrociate. ;)

Altri suggerimenti

Chiama itemupdated sulla tua ArrayCollection quando si aggiorna un "pezzo" di un articolo archiviato in esso.

Potrebbero esserci molti problemi con il vincolo. Pubblica il codice per aiutarci a vedere cosa sta succedendo. Ecco alcune cose "di alto livello" a cui fare attenzione a ciò che potrebbe rispondere alla tua domanda

Quando si utilizza una matrice vincolabile degli oggetti, è importante notare che l'associazione per l'ArrayCollection esamina solo ogni istanza dell'oggetto e se viene aggiunto o rimosso dalla raccolta. Non saprà le modifiche alla proprietà che si verificano al tuo oggetto. Comunemente quando si utilizza un elementorenter, le proprietà sono destinate a visualizzare elementi. Come forse la proprietà "Valore" legata a un'etichetta nel numero di elementi. Ora, quando l'istanza dell'oggetto (myModel) cambia la proprietà "valore", l'etichetta dovrebbe raccoglierla. Si noti inoltre che è necessario contrassegnare eventuali proprietà che si intendono legarsi agli elementi visivi con il meta-tag [vincolabile].

public class myModel
{
    [Bindable]
    public var label:String;
    [Bindable]
    public var value:String; 

    public function myModel() {}
}

Risposta dopo il post del codice:

Quando fai quanto segue:

myArrayCollection.addItem(new MyClass("This is a label", firstClassInstance.firstValue));

Stai prendendo il valore di FirstClassInstance.FirstValue e fornendolo come valore duro (come nel non passare valore per riferimento). Quindi, se fai quanto segue:

myArrayCollection.getItemAt(addedClassIndex).value = 5;

Non causerà alcuna modifica a non notare modifiche in FirstClassInstance.FirstValue in quanto non ci sono "informazioni di riferimento" memorizzate. Stiamo solo lavorando con il tipo di numero di base che non viene mai superato per riferimento come tutti gli altri oggetti sono in flessione.

Forse prova questo:

[Bindable]
public class MyClass
{
    public var label:String;

    [Bindable]   //might be redundant due to global [Bindable] flag, been a while since i've used a global one
    public function get value():Number{
        return m_objRef.firstValue;
    }
    public function set value(value:Number):void{
        m_objRef.firstValue = value;
    }

    private var m_objRef:FirstClass;

    public function MyClass(_label:String, _valueObj:FirstClass) {
        m_objRef = _valueObj;
        label = _label;
    }
}

Ragazzi di tutti i due (e ragazze;)) dopo due ore di casino con bindingutili, ho finalmente trovato la soluzione al mio problema. Le due classi di modelli possono rimanere così come sono, quindi non è necessario passare l'istanza di Firstclass. Basta vincolare le proprietà del valore di Firstclass al campo Valore di Myclass funziona come previsto e anche i valori nella ArrayCollection vengono aggiornati.

Quindi la soluzione;

myClassObject = new MyClass();
myClassObject.label = "This is a label";
BindingUtils.bindProperty(myClassObject, "value", firstClassObject, "firstValue");

E poi aggiungi semplicemente il myclassObject all'ArrayCollection.

Tieni presente che tutto il codice qui è il codice pseudo, quindi non importa alcun battitura.

Tuttavia, @windowns che suggerisce di passare l'oggetto di primo Classe alla Myclass verrà incorporato nella mia soluzione finale in quanto rende molto più semplice il passaggio da un passaggio da parte delle proprietà (Firstclass ne ha molti, non solo i 4 nel mio primo post). Molte grazie per questo!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top