2012-02-08 2 views
1

Je ne parviens pas à lier la propriété publique selectedIndex d'une étincelle DropDownList à sa source d'origine dans le modèle de présentation de la vue. Pour répliquer ce problème avec le moins de lignes possible, j'ai deux vues et un modèle de présentation. Le code suit.Impossible de lier l'élément selectedIndex d'une DropDownList au membre selectedIndex d'une classe Bindable

Main.mxml

<?xml version="1.0" encoding="utf-8"?> 
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
       xmlns:s="library://ns.adobe.com/flex/spark" 
       xmlns:mx="library://ns.adobe.com/flex/mx" 
       minWidth="955" 
       minHeight="600" 
       xmlns:views="com.blah.views.*"> 

    <views:DropDownListView/> 

</s:Application> 

DropDownListView.mxml

<?xml version="1.0" encoding="utf-8"?> 
<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" 
     xmlns:s="library://ns.adobe.com/flex/spark" 
     xmlns:mx="library://ns.adobe.com/flex/mx" width="400" height="300"> 

    <fx:Script> 
     <![CDATA[ 
      import com.blah.presentationmodels.DropDownListPresentationModel; 

      [Bindable] 
      private var pm:DropDownListPresentationModel = new DropDownListPresentationModel(); 
     ]]> 
    </fx:Script> 

    <s:DropDownList id="myDropDownList" 
        dataProvider="{pm.list}" 
        selectedIndex="{pm.selectedIndex}" 
        valueCommit="{pm.selectionChanged()}"/> 

</s:Group> 

DropDownListPresentationModel.as

package com.blah.presentationmodels 
{ 
    import mx.collections.ArrayCollection; 

    [Bindable] 
    public class DropDownListPresentationModel 
    { 
     public var selectedIndex:int = -1; 
     public var list:ArrayCollection = new ArrayCollection(); 

     public function DropDownListPresentationModel() 
     { 
      list.addItem("Load of Bread"); 
      list.addItem("Stick of Butter"); 
      list.addItem("Carton of Milk"); 
     } 

     public function selectionChanged():void 
     { 
      var newSelectedIndex:int = selectedIndex; // always -1 
     } 
    } 
} 

Débogage de l'application Je trouve que selectedIndex dans le modèle de présentation reste toujours à la valeur par défaut assignée quel que soit l'élément que j'ai sélectionné dans DropDownList. Pour l'exemple de code ci-dessus c'est -1.

Comment lier l'élément selectedIndex dans le modèle de présentation afin qu'il soit mis à jour de manière appropriée lorsque l'élément sélectionné DropDownList change?

Répondre

4

Débogage l'application que je trouve que selectedIndex dans le modèle de présentation reste toujours à la valeur par défaut attribuée quelle que soit la question que je choisi dans le DropDownList. Pour l'exemple de code ci-dessus est -1.

Ceci est correct en fonction du code que vous avez fourni. Vous avez lié le pm.selectedIndex à myDropDownList.selectedIndex. Ainsi, chaque fois que pm.selectedIndex change, la valeur de myDropDownList.selectedIndex change.

Ce que vous n'avez pas fait est lié à myDropDownList.selectedIndex à pm.selectedIndex. Donc, toute modification de myDropDownList.selectedIndex n'aura absolument aucun effet sur pm.selectedIndex. La meilleure façon de faire de cette « liaison » fonctionne dans les deux sens est d'utiliser la syntaxe abrégée MXML:

<s:DropDownList id="myDropDownList" 
       selectedIndex="@{pm.selectedIndex}" /> 

More information on that in the docs, qui comprennent aussi l'alternative « pré-Flex 4 » qui est d'utiliser la balise de liaison:

<mx:Binding source="myDropDownList.selectedIndex" destination="pm.selectedIndex"/> 
Questions connexes