Двусторонняя привязка данных для выбранного элемента Combobox не работает с помощью символа @ в Adobe Flex 4 - PullRequest
1 голос
/ 27 июля 2011

Мне нужно включить двустороннюю привязку данных в selectedItem в поле со списком и в поле значение объекта.Я использую конструкцию @ {variable name}.

Это работает в одну сторону - когда поле valueobject изменяется, selectedItem в combobox обновляется.Но реверс не работает, если я не обработаю событие изменения в combobox явно.Есть ли причина, по которой @ не работает, как и ожидалось.

В следующем фрагменте кода я пытаюсь привязать OrderInfo.billingName к combo1.selectedItem.

1-й вариант использования : начальное значение OrderInfo.billingName устанавливается равным combo1.selectedItem

2-й вариант использования : в случае значения OrderInfo.billingNameизменяется между ними, затем также обновляется combo1.selectedItem

3-й вариант использования : когда пользователь выбирает какое-либо значение из combo1, он не получает присвоение OrderInfo.billingName, пока я не обработаю изменениесобытие.

[Bindable]

public class OrderInfo {

        public var billingName:String ; //This field is bindable to combo1’s selectedItem
        public var billingAddress:String;
        public var billingCity:String;
        public var billingState:String;
        public var billingZip:String;
        public var cardType:String;
        public var cardNumber:String;
        public var cardExpirationMonth:String;
        public var cardExpirationYear:String;
        public var deliveryDate:Date;

        public function OrderInfo() {
        }
        public function toString ():String {
              return "I am OrderInfo : " + this.billingName + this.billingCity;
        }
  }

<?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"
                 initialize="application1_initializeHandler(event)">
  <fx:Script>
        <![CDATA[
              import mx.binding.utils.BindingUtils;
              import mx.collections.ArrayCollection;
              import mx.controls.Alert;
              import mx.events.FlexEvent;
              import mx.events.IndexChangedEvent;
              import mx.utils.ObjectUtil;

              import spark.events.IndexChangeEvent;
              [Bindable]
              public var dp:ArrayCollection = new ArrayCollection (
                    [     {Id:'one', Amount:1000},
                          {Id:'two', Amount:2000},
                          {Id:'three', Amount:3000}
                    ]
              );
              [Bindable]
              public var orderInfo:OrderInfo = new OrderInfo();
              protected function application1_initializeHandler(event:FlexEvent):void
              {
                    //Initial value of the field .. this could be coming via database
                    orderInfo.billingName = 'one';
              }


              protected function combo1_changeHandler(event:IndexChangeEvent):void
              {
                    orderInfo.billingName = (((event.currentTarget as 
                    ComboBox).selectedItem as Object).Id); //??
              }

              protected function button1_clickHandler(event:Event):void
              {
                    mx.controls.Alert.show(ObjectUtil.toString(orderInfo));
              }

              protected function button2_clickHandler(event:Event):void
              {
                    // Some backend process changed the value object
                    orderInfo.billingName = 'three';
              }
        ]]>
  </fx:Script>

  <s:ComboBox id="combo1" x="81" y="65"
                    dataProvider="{dp}"
                    labelField="Id"
                    selectedItem="@{orderInfo.billingName}"
                    change="combo1_changeHandler(event)"
                    />

  <s:Button label="Get OrderInfo Object Snapshot" click="button1_clickHandler(event)" 
   x="273" y="176"/>
  <s:Button label="Change OrderInfo Object" click="button2_clickHandler(event)" 
   x="52"    y="176"/>

1 Ответ

0 голосов
/ 23 июля 2013

Я также изучаю возможность работы этой функции.Я считаю, что проблема заключается в том, что связано.Свойство selectedItem ожидает объект типа *, что означает элемент из arrayCollection, с которым он связан.Поэтому попробуйте передать один или эти объекты

({Id:'one', Amount:1000},{Id:'two', Amount:2000},{Id:'three', Amount:3000})

в свойство selectedItem вместо строки.

...