2011-01-02 3 views
1

Da ich Flex etwas neu bin, fehlt mir hier etwas Grundlegendes. Ich habe einen Spark-List-Container, dessen DataProvider an eine Ergebnismenge gebunden ist, die von einem RemoteObject-Aufruf zurückkommt. Ziemlich normales Zeug.Wie programmatisch ein Element in einer Flex-Liste auswählen, nachdem DataProvider aktualisiert wurde?

<s:List id="list" dataProvider="{model.stuff}" width="100%" height="100%" 
     selectedIndex="@{selectedSlider.value}" 
     itemRenderer="{stuffRenderer}"> 

</s:List> 

Der selectedIndex ist mit einem HSlider verbunden, aber das ist nicht das Problem. Mein Problem ist, dass ich automatisch ein bestimmtes "bevorzugtes" Element aus der Liste auswählen möchte (nur anfänglich ... um den Benutzer zu führen).

Ich habe versucht, das in einem creationComplete-Ereignis zu tun, aber meine Daten waren noch nicht aufgetaucht ... Einstellung hat nicht funktioniert ... es war zu früh.

Was ist der richtige Weg?

Antwort

2
private function findAllUsers_resultHandler(e:ResultEvent):void 
{ 
    list.dataProvider = new ArrayCollection(e.result as Array); 
    if(firstTry) 
    { 
     list.selectedIndex = 0; 
     firstTry = false; 
    } 
} 
+1

Das würde funktionieren, außer dass meine Modellschicht keine Ansichten kennt. Es hat mir jedoch die Idee gegeben, ein benutzerdefiniertes model changed-Ereignis in meiner Model-Ebene und einen benutzerdefinierten Listener in meiner Ansicht zu erstellen. Versuchte dies und es funktioniert einfach. – HDave

+0

Ja tatsächlich. Wenn ich Sie wäre, würde ich einen Blick auf die Cairngorm Observer Lib tp mit solchen Dingen –

1

Ich glaube, es sollte funktionieren, wenn Sie nur den Anfangswert des Schiebereglers auf den Index festlegen, der am Anfang ausgewählt werden soll. Etwas wie folgt aus:

<s:List dataProvider="{yourData}" selectedIndex="{hSlider.value}" /> <s:HSlider id="hSlider" minimum="0" maximum="{yourData.length - 1}" stepSize="1" value="theIndexYouWantAsInitial" liveDragging="true" /> 

Das sollte funktionieren. HTH FTQuest

+0

Ich habe es versucht, aber leider hat es keine Wirkung. Der HSlider startet an der richtigen Stelle, aber das Objekt ist nicht in der Liste ausgewählt. Offen für alle anderen Ideen ... – HDave

2

spark.components.Listspark.components.SkinnableDataContainer hat in seiner Klassenhierarchie, die ein dataProviderChanged Ereignis auslöst, wenn die Datenprovider ändern. Leider gibt es keine [Event] Metadaten in SkinnableDataContainer, die dieses Ereignis in MXML verwenden können. Sie müssen also Ihre eigene benutzerdefinierte Komponente erstellen, die List erweitert.

package 
{ 
    import spark.components.List; 

    [Event(name="dataProviderChanged", type="flash.events.Event")] 
    public class MyList extends List 
    { 
     public function MyList() 
     { 
      super(); 
     } 
    } 
} 

Durch die benutzerdefinierte Komponente verwenden, können Sie einen Ereignis-Listener für dataProviderChanged hinzufügen und aktualisieren Sie Ihre selectedIndex entsprechend.

<ns1:MyList id="list" dataProvider="{model.stuff}" width="100%" height="100%" 
     dataProviderChanged="selectedIndex = selectedSlider.value" 
     selectedIndex="@{selectedSlider.value}" 
     itemRenderer="{stuffRenderer}"> 
</ns1:MyList> 

BTW: Das funktioniert mit anderen List -basierten Komponenten (wie DropDownList) zu.

+0

Zweifellos würde dies funktionieren ... aber ich bin auf der Suche nach einer einfacheren Lösung mit Ereignissen. – HDave

+0

Nun, wenn Sie die MXML-Unterstützung nicht benötigen, können Sie den Ereignis-Listener mit ActionScript hinzufügen. Dann brauchen Sie keine benutzerdefinierte Komponente. Natürlich ist auch Ihre ereignisbasierte Lösung in Ordnung. –

Verwandte Themen