Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flex (http://www.flasher.ru/forum/forumdisplay.php?f=84)
-   -   Bindable в ItemRenderer на основе UIComponent (http://www.flasher.ru/forum/showthread.php?t=123783)

Pow R. Toc H. 10.04.2009 01:14

Bindable в ItemRenderer на основе UIComponent
 
Здравствуйте. Столкнулся с такой проблемой: хочу создать itemRenderer на основе UIComponent, но не знаю как отловить изменение данных. Eсли делать на основе Canvas то всё просто:
Код:

<mx:Canvas>
    <mx:Label text="{data.price}" />
</mx:Canvas>

- как только значение price изменилось - itemRenderer перерисовался, но как реализовать подобное в UIComponent без понятия.
Функция
Код AS3:

 
public function set data(value:Object):void
{
        this._data = value;
        invalidateProperties();           
        dispatchEvent(new FlexEvent(FlexEvent.DATA_CHANGE));
}

отрабатывается только при первоначальной установке данных

Ales Protiv 10.04.2009 01:30

см. mx.binding.BindingUtils

Pow R. Toc H. 10.04.2009 16:03

установил что изменения отлавливаються когда слушаю простое свойство объекта:
Код AS3:

BindingUtils.bindSetter(this.changed,  this._data, 'rating');

но когда весь объект - не срабатывает:
Код AS3:

BindingUtils.bindSetter(this.changed,  this, 'data');

(_data - приватная переменная, this.data - set/get data)
Несколько неудобно потому что надо отслеживать несколько свойств.

GBee 10.04.2009 17:03

А не проще создать свою переменную с тагом [Bindable] (даже нужного класса) и в сеттере data в нее все пихать, а она уже биндится к контролам?

Anaza 11.04.2009 12:25

Может поможет данный код, если я правильно поняла, что Вы хотите. У меня сделано так

Код AS3:

        <comp:CourseList id="economCourse" label="Экономика" 
                gridData = "{courseData1}"
                selectCourseEvent = "selectCourseEventHandler(event)"/>

CourseList.mxml
Код AS3:

<?xml version="1.0" encoding="utf-8"?>
<mx:HBox xmlns:mx="http://www.adobe.com/2006/mxml"
        xmlns:comp="components.*">
        <mx:Metadata>
                [Event(name="selectCourseEvent", type="events.CourseEvent")]
        </mx:Metadata>
 
        <mx:Script>
                <![CDATA[
 
                        import mx.controls.dataGridClasses.DataGridColumn;
                        import events.CourseEvent;
                        import valueObjects.Course;
                        import mx.events.ListEvent;
                        import mx.collections.ArrayCollection;
 
                        [Bindable]
                        public var gridData:ArrayCollection;
 
                        private function itemClickHandler(event:ListEvent):void{
                                var courseData:Course;
                                courseData = event.itemRenderer.data as Course;
                                var courseEventObject:CourseEvent = new CourseEvent("selectCourseEvent", courseData);
                                dispatchEvent(courseEventObject);
                        }       
                ]]>
        </mx:Script>
 
        <mx:DataGrid id="employeeGrid1"
                width="413" height="377"
                dataProvider="{gridData}"
                itemClick = "itemClickHandler(event)">
                        <mx:columns>
                                <mx:DataGridColumn itemRenderer="components.CoursesRenderer"/>
                        </mx:columns>
                </mx:DataGrid>
</mx:HBox>

CourseRender
Код AS3:

<?xml version="1.0" encoding="utf-8"?>
<mx:HBox xmlns:mx="http://www.adobe.com/2006/mxml">
                <mx:Label text="{data.courseName}" fontWeight="bold" fontSize="12"/>       
                <mx:Label text="Препопадет: {data.partyId}"/>
</mx:HBox>

CourseEvent.as
Код AS1/AS2:

package events
{
        import flash.events.Event;
 
        import valueObjects.Course;
 
        public class CourseEvent extends Event
        {
                public var course:Course;
 
                public function CourseEvent(type:String, course:Course)
                {
                        super(type);
                        this.course = course;                       
                }
 
                override public function clone():Event{
                        return new CourseEvent(type, course);
                }               
 
        }
}

Вроде все выложила, что надо :rolleyes:

GBee 11.04.2009 12:34

По моему, он хотел другого кода :о)


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

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