Как повторно отрендерить itemRenderer для DropDownList во Flex4? - PullRequest
2 голосов
/ 02 марта 2011

Я создал пользовательский ComboCheck, который расширяет спарк DropDownList, который является DropDownList флажков. Внутри моего itemRenderer у меня есть код:

[Bindable]override public function set data (value:Object):void {
    if (value!=null) {
        _data = value;
        item.label = value.label;
        item.group = value.group;
        item.toolTip = value.toolTip;
        item.selected = value.selected;
        item.enabled = value.enabled;
    ...

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

Моя проблема заключается в том, что, когда DropDownList работает, элементы уже были обработаны, поэтому изменение свойства enabled для каждого элемента, который должен быть отключен, не изменяет элементы, которые уже были отображены. Если вы прокрутите вниз и вернетесь назад для повторного рендеринга данных, все будет хорошо.

Есть ли способ заставить itemRenderer повторно визуализировать данные на экране, чтобы он обновил и применил это обновление?

Ниже приведен пример кода выбранного элемента, он отключает все остальные элементы, а затем включает только тот, который вы выбрали. У меня также есть функция itemDeselect, которая уменьшает itemCount и разрешает все </p> <pre><code>private function itemSelect(evt:Event):void{ itemCount++; var myText:String = ''; var items:Vector.<Object> = allItems.selectedItems; if(itemCount == 1){ for each(var obj:Object in allItems.dataProvider){ obj.enabled = false; } } for (var i:String in items) { if(items[i].group == "HU"){ items[i].enabled = true; huList[items[i].label] = items[i].selected; }else if(items[i].group == "ALL"){ items[i].enabled = true; allCase = items[i].selected; }else{ items[i].enabled = true; otherList[items[i].label] = items[i].selected; } } selectionChanged = true; }

Это работает, но опять-таки не перерисовывается, поэтому obj.enabled=false не появляется, если вы не прокрутите вниз и не вернетесь назад.

РЕДАКТИРОВАТЬ: окончательное решение
Используя третий вариант, предложенный www.Flextras.com, я использовал свойство itemUpdated dataProvider.itemUpdated (obj), поэтому внутри

</p> <pre><code>for each(var obj:Object in allItems.dataProvider){ obj.enabled = false; allItems.dataProvider.itemUpdated(obj); }

Это также не приведет к сбросу выпадающего списка в scrollPosition 0

Ответы [ 3 ]

3 голосов
/ 02 марта 2011

Есть ли способ, чтобы itemRenderer повторно отобразил данные, которые показаны для применения этого обновления?

У меня есть три способа .

1) сделать недействительной группу данных списка вместо списка.

listInput.dataGroup.invalidateDisplayList();

2) Обновите dataProvider

(listInput.dataProvider as ArrayCollection).refresh();

3) При изменении элемента dataProvider вызовите свойство itemUpdated () коллекции.Нет примера кода для этого, извините.

Единственное, что я часто забываю сделать в этой ситуации, это реализовать средство визуализации, чтобы оно могло переключиться обратно в состояние «неактивно».Поэтому в вашем методе set данных itemRenderer обязательно добавьте условие else, возвращающее все эти значения к некоторому значению по умолчанию.

1 голос
/ 03 августа 2011

Я нашел способ «перерисовать», просто переопределить функцию set data и обновить все свойства в itemRenderer: например,

У меня есть DataGrid со столбцом с itemRenderer, который показывает разные backgroundColor для каждого элемента в моем dataProvider.

<mx:DataGrid>
  <mx:columns>
    <mx:DataGridColumn itemRenderer="myItemRenderer"/>
  </mx:columns>
</mx:DataGrid>

// myItemRenderer:

override public function set data( value:Object ) : void {
  super.data = value;
  if( value > 0) setStyle("backgroundColor",0xff99ff);
  else setStyle("backgroundColor",0xffffff);
}

Вот и все.

0 голосов
/ 23 августа 2011

Вы также можете добавить прослушиватель событий для события dataChange к самому средству визуализации элементов. Это событие вызывается после изменения свойства data.

<s:ItemRenderer dataChange="updateView(event)">
    <fx:Script>
        <![CDATA[
            protected function updateView(event:Event):void{
                //update logic
            }
        ]]>
    </fx:Script>
</s:ItemRenderer>
...