Bindable combobox - выбранный элемент / индекс - PullRequest
0 голосов
/ 15 июня 2009

Я пытаюсь привязать элемент сетки данных к комбинированному списку, чтобы при выборе пользователем элемента в сетке данных форма отображала выбранные данные для редактирования, однако один из моих элементов - это комбинированный список с использованием провайдера данных.

Я бы хотел, чтобы элемент, выбранный в таблице данных, соответствовал выбранному элементу в выпадающем списке, но эта часть подойдет, однако, если мой элемент таблицы данных пуст, то я не могу получить в поле со списком для выбранного индекса значение -1?

(то же самое происходит, если вы используете мастер CRUD в Flex Builder 3 для ColdFusion)

Я использую следующий код для своего пользовательского комбинированного списка:

<mx:ComboBox
  xmlns:mx="http://www.adobe.com/2006/mxml" 
  xmlns="*" 
  creationComplete="componentInit()"
>
  <mx:Script>
<![CDATA[
import mx.utils.ObjectUtil;
import mx.controls.Alert;

[Bindable]
public var valueField:String = "";

[Bindable]
public var labelFields:Array = [];

public function componentInit():void {
   this.labelFunction = renderLabelFunction;
}

public function renderLabelFunction(item:Object):String {
   var result:String = "";

   if (labelFields.length == 0) {
     if (labelField != null) {
       return item[labelField];
     } else {
       return item.toString();
     }
   }
   else {
     for(var i:int=0; i < labelFields.length; i++) {
       if (i > 0) {
         result += " ";
       }
       result += item[labelFields[i]];
     }
   }
   return result;
}

override public function set selectedItem(val:Object):void {
  //Alert.show(valueField +":" +ObjectUtil.toString(val));
  if( this.valueField != null) {
    for(var i:int=0; i < this.dataProvider.source.length; i++) {
      var item:Object = this.dataProvider.source[i];
      if ( item[valueField]== val ) {
        // if it matches, make it selected.
        this.selectedIndex = i;
        break;
      }
    }
  } else {
    this.selectedIndex = -1;
  }
}

public function get selectedItemValue():Object {
  if( this.valueField != null && selectedItem != null) {
    return selectedItem[valueField];
  } else {
    return text;
  }
}
]]>
    </mx:Script>
</mx:ComboBox>

и часть MXML, вызывающая комбокс, выглядит так: -

<mx:DataGrid id="clientDatagrid" selectedIndex="1" visible="true"/>
<mx:Form height="305">

  <mx:FormItem direction="horizontal" label="Surname" required="true" visible="true" width="100%" horizontalAlign="left">
     <mx:TextInput enabled="true" id="Surname" text="{clientDatagrid.selectedItem.Surname}" width="100%" visible="true"/>
  </mx:FormItem>

  <mx:FormItem direction="horizontal" label="Forename" required="true" visible="true" width="100%" horizontalAlign="left">
     <mx:TextInput enabled="true" id="Forename" text="{clientDatagrid.selectedItem.Forename}" width="100%" visible="true"/>
  </mx:FormItem>

  <components:BindableComboBoxa id="gender"
              dataProvider="{genderData}"
              valueField="Code"
              labelField="Description"
              />

</mx:form>

Любая помощь будет высоко ценится.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 23 декабря 2009

попробуйте установить приглашение для комбинированного списка следующим образом:

<components:BindableComboBoxa id="gender"
              dataProvider="{genderData}"
              valueField="Code"
              labelField="Description"
              prompt="Please Select"
              />
0 голосов
/ 16 июня 2009

В сеттинге selectedItem тестирование this.valueField на нулевое значение бесполезно, поскольку в mxml вы установили его как «Код» Вместо этого вы должны проверить, является ли val нулевым.

Так что просто замените

if( this.valueField != null) 

с

if( val != null)

и тогда должно получиться.

...