Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flex (http://www.flasher.ru/forum/forumdisplay.php?f=84)
-   -   Байндинг пользовательского списка не получается (http://www.flasher.ru/forum/showthread.php?t=140525)

Dimitry_II 01.06.2010 17:30

Байндинг пользовательского списка не получается
 
Есть коллекция объектов, отображаемая в таблице. Одно из свойств каждого объекта - также объект с набором свойств. В зависимости от выбора из коллекции объекта хочу, чтобы менялось отображение дочернего. Задание пустяковое, если бы не способ отображения: свойства дочернего объекта я хочу расположить в списке.

Ход мыслей был таков:
основная таблица с коллекцией объектов:
Код:

<mx:DataGrid id="grid" dataProvider="{some_collection}"/>
отображаемый список свойств дочернего объекта:
Код:

<mx:List labelFunction="listLabelFunction">
    <mx:Object label="Property 1:" data="{grid.selectedItem.sl_object.prop1}"/>
    <mx:Object label="Property 2:" data="{grid.selectedItem.sl_object.prop2}"/>
</mx:List>
<mx:Script>
    private function listLabelFunction(item:Object):String {
        return item.label + " " + item.data;
    }
</mx:Script>

Но поля не меняются.
В принципе, я понимаю, что пытаюсь менять провайдер провайдера, что, видимо, неправильно по определению.

Могу сделать реакцию на изменение выбранного объекта в коллекции и менять вручную соответствующие элементы коллекции, которую и забайндить на List. Но мне кажется, что это неправильно.

Возможно, я пошел неправильно в желании именно так отобразить поля объекта (нужен другой элемент), может, неправильно что-то делаю. Но мне кажется, что можно автоматизировать этот процесс.

Задача вроде не очень сложная, но слету решить не получается.

Добавлено через 28 часов 32 минуты
Всему свое время. Лучше разобрался в байндинге, эдиторах и рендерах и все стало ясным и понятным. Если совсем по-простецки, то рендерер такой, а с эдитором надо повозиться:
Код:

<mx:List dataProvider="{grid.selectedItem.sl_object}">
    <mx:itemRenderer>
        <fx:Component>
            <mx:VBox paddingTop="0">
                <mx:Label text="{'Property 1: ' + data.prop1}"/>
                <mx:Label text="{'Property 2: ' + data.prop2}"/>
            </mx:VBox>
        </fx:Component>
    </mx:itemRenderer>
</mx:List>

А если уже по-серьезному подойти, то так:
Код:

[Bindable]
public var myobj:ArrayCollection = new ArrayCollection([{title:"Property1:", advalue:""}, {title:"Property 2:", advalue:""}]);

//реакция основной таблицы на изменение положения
protected function gridChangeHandler(event:ListEvent):void {
        var isSelected:Boolean = grid.selectedIndex != -1;
        myobj[0].advalue = isSelected ? grid.selectedItem.sl_object.prop1 : "";
        myobj[1].advalue = isSelected ? grid.selectedItem.sl_object.prop2 : "";
        myobj.dispatchEvent(new CollectionEvent(CollectionEvent.COLLECTION_CHANGE));
}

<mx:DataGrid headerHeight="0" dataProvider="{myobj}">
        <mx:columns>
                <mx:DataGridColumn dataField="title" width="100" textAlign="right"/>
                <mx:DataGridColumn dataField="advalue"/>
        </mx:columns>
</mx:DataGrid>



Часовой пояс GMT +4, время: 02:59.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.