Привязка данных AS3 к определенному свойству по индексу в ArrayCollection

У меня есть ситуация, когда я хочу использовать привязку данных из ArrayCollection для заполнения текстовых полей в представлении Flex.

Коллекция ArrayCollection заполняется из объекта SQL Result. Я сохраняю ArrayColelction в своем классе модели, используя такие методы получения и установки:

private var _monthlyData:ArrayCollection;

public function set monthlyData(value:ArrayCollection):void{
_monthlyData = value;
}

[Bindable]
public function get monthlyData():ArrayCollection{
return _monthlyData;
}

Я использую monthData в качестве поставщика данных для списка и т. Д., Который отлично работает. Мне также нужно использовать свойства по определенным индексам в этой коллекции как строки текстового поля. Когда установлены свойства текста текстового поля, у меня еще нет необходимости заполнять массив monthData arrayCollection.

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

textField.text = _model.monthlyData.getItemAt(3).Month;

Я хочу настроить привязку к коллекции массивов, а не просто использовать этот метод присваивания, чтобы при обновлении этого элемента в массиве или при заполнении или обновлении всей arrayCollection он обновлял текст textField. У меня проблемы с настройкой привязки.

В настоящее время я использую bindageTools, но также малоэффективно использую встроенный as3 BindingUtils.

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

Bind.fromProperty(_model.monthlyData.getItemAt(3),"Month").toProperty(textField, "text");

Так что, если бы кто-нибудь мог указать мне правильное направление относительно того, какой способ лучше всего получить привязку в чистом AS3 без MXML, я был бы очень признателен.

Ура Марко


person Marco Polo    schedule 19.01.2014    source источник
comment
Это происходит внутри ItemRenderer или вы выбираете один элемент из коллекции, который хотите привязать к текстовому полю? Также о The text fields are set in another outside class with has a singleton reference to this model: вы никогда не должны напрямую устанавливать значение элемента представления; установить модель и позволить привязке данных соответствующим образом обновить представление.   -  person RIAstar    schedule 19.01.2014
comment
Привет, РИАстар. Этого не происходит внутри средства визуализации элементов. У меня есть пара меток Spark внутри искрового представления / скроллера / Vgroup ... Я хотел бы привязать их текстовые свойства к значению в ArrayCollection.   -  person Marco Polo    schedule 19.01.2014


Ответы (1)


Из предоставленного вами кода я вижу, что monthlyData можно привязать, и это нормально. Я предполагаю, что _model тоже может быть привязан.
Однако метод getItemAt() не может быть привязан (он не будет отправлять события изменения свойства, когда элементы меняют положение в коллекции), поэтому текстовое свойство текстового поля не будет обновлено.

Вы можете сделать что-то вроде этого:

[Bindable]
public var selectedDate3:MyDate;

<s:TextInput id="myTextInput" text="{selectedDate3.month}" />

или эквивалент AS (почему вы хотите усложнить себе жизнь, я не понимаю)

BindingUtils.bindProperty(myTextInput, "text", selectedDate3, "month");

а затем программно обновить selectedDate3:

_model.monthlyData.addEventListener(CollectionEvent.COLLECTION_CHANGE, updateSelected);

private function updateSelected(event:CollectionEvent):void {
    selectedDate3 = _model.monthlyData.getItemAt(3);
}

Обратите внимание, что свойство month MyDate также должно быть привязанным.


Вы упомянули, что эти поля находятся в VGroup. Я предполагаю, что вы хотите отобразить тройку лучших или что-то в этом роде. Это все еще список. Было бы намного проще и чище сделать это с помощью List или DataGroup и просто отфильтровать ArrayCollection, чтобы отображались только первые 3 элемента (или любое другое правило для отображаемых элементов), или настроить DataGroup для отображения только трех элементов (это в любом случае не имеет полосы прокрутки).

person RIAstar    schedule 19.01.2014
comment
Привет, РИАстар. Спасибо за вашу помощь. Я должен придерживаться AS3, поэтому я буду придерживаться сценария слушателя, который вы показали. Возможно, мне нужно переосмыслить свою структуру в долгосрочной перспективе, но сейчас это должно сработать. Ценю вашу помощь. - person Marco Polo; 20.01.2014