Вылет Itemrenderer при выборе - PullRequest
0 голосов
/ 28 мая 2011

имеют расширенную сетку данных с простым настраиваемым mxadvanceddatagriditemrenderer.Я хочу, чтобы средство визуализации отображало изображение только тогда, когда строка наведена или выбрана.Прямо сейчас я делаю это с помощью тега excludeFrom = "normal" на моем изображении.

Он работает нормально (за исключением выбранного состояния, он исчезает при выборе), когда у меня заданы состояния и определены нормальные состояния.Когда я пытаюсь определить выбранное состояние, при щелчке строки я получаю следующую ошибку:

RangeError: Index 0 is out of range.
    at spark.components::Group/checkForRangeError()[E:\dev\4.x\frameworks\projects\spark\src\spark\components\Group.as:1106]
    at spark.components::Group/setElementIndex()[E:\dev\4.x\frameworks\projects\spark\src\spark\components\Group.as:1265]
    at spark.components::Group/addElementAt()[E:\dev\4.x\frameworks\projects\spark\src\spark\components\Group.as:1167]
    at mx.states::AddItems/addItemsToContentHolder()[E:\dev\4.x\frameworks\projects\framework\src\mx\states\AddItems.as:737]
    at mx.states::AddItems/apply()[E:\dev\4.x\frameworks\projects\framework\src\mx\states\AddItems.as:545]
[E:\dev\4.x\frameworks\projects\framework\src\mx\core\UIComponent.as:9961] ... etc

Кто-нибудь испытывал это раньше или знает решение?

Спасибо

РЕДАКТИРОВАТЬ: соответствующий код очень прост:

<s:MXAdvancedDataGridItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" focusEnabled="false">
<fx:Script>
<![CDATA[
import mx.collections.IList;
protected function removeRow(event:MouseEvent):void
{
var ind :int = IList(parentDocument.dataGrid.dataProvider).getItemIndex(data);
IList(parentDocument.dataGrid.dataProvider).removeItemAt(ind);
}   
]]>
</fx:Script>
<s:states>
<s:State name="normal" />
<s:State name="hovered"/>
<s:State name="selected"/>
</s:states>
<mx:Image id="removeButton" excludeFrom="normal" source="@Embed(source='../assets/icons/close_icon.gif')" click="removeRow(event)" width="10" height="10" alpha=".5" toolTip="{resourceManager.getString('localization', 'REMOVE')}"/>
</s:MXAdvancedDataGridItemRenderer>

1 Ответ

1 голос
/ 28 мая 2011

Может показаться - хотя это и немного догадка - что вы пытаетесь удалить разборщик вещей, одновременно изменяя его состояние («выбрано», нажав на него).

Вот мое решение для ситуации, в которой вы хотите удалить средство визуализации элементов, щелкнув по нему: просто сделайте так, чтобы оно отправляло всплывающее событие «удалить», и пусть какой-то контроллер обрабатывает удаление.

Так что ваш itemrender может выглядеть так:

<s:ItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009" 
                xmlns:s="library://ns.adobe.com/flex/spark">

    <fx:Script>
        <![CDATA[
            import mx.events.FlexEvent;
        ]]>
    </fx:Script>

    <s:states>
        <s:State name="normal" />
        <s:State name="hovered" />
        <s:State name="selected" />
    </s:states>

    <!-- some other stuff -->

    <s:Button label="remove me" excludeFrom="normal"
              click="dispatchEvent(new FlexEvent(FlexEvent.REMOVE, true))" />

</s:ItemRenderer>

Значение 'true' там является важным для того, чтобы событие всплыло до компонента List.

Затем в контроллере, который имеет ссылку на List (или DataGrid) или, возможно, в подклассе List (или DataGrid), вы перехватываете это событие и удаляете элемент.

theList.addEventListener(FlexEvent.REMOVE, handleRemoveRequest);

private function handleRemoveRequest(event:FlexEvent):void {
    var itemRender:IItemRenderer = event.target as IITemrenderer;
    var item:SomeClass = itemRender.data;
    var index:int = theDataProvider.getItemIndex(item);
    theDataProvider.removeItemAt(index);
}

Здесь важно, чтобы вы использовали target вместо currentTarget, поскольку первым будет ItemRenderer, а последним будет сам список.

...