Невозможно привязать к свойству пользовательского компонента - PullRequest
0 голосов
/ 26 февраля 2010

Невозможно связать данные с пользовательским компонентом. Я пробовал BindUtilis и {}, но не могу понять это. Вот что у меня есть:

У меня есть класс DataModel, который стал привязываемым

В Mainn.mxml у меня есть два компонента: DataGrid (используется для тестирования) и CustomComponent (который расширяет Canvas)

Когда данные в DataModel.somelist обновляются, DataGrid отражает изменения, но пользовательский компонент не отображается.

Я ожидал увидеть трассировку (CustomComponent.dataProvider) при каждом изменении this._dataModel.itemList. Что я делаю неправильно?

Main.mxml выглядит примерно так:

<mx:Script>
<![CDATA[
    import model.DataModel;

    [Bindable]
    private var _dataModel:DataModel = DataModel.getInstance();

]]>
</mx:Script>

<mx:VBox width="100%" height="100%">
    <views:ItemDisplayList  width="100%" height="300" id="idl" >
        <views:dataProvider>
            {this._dataModel.itemList}
        </views:dataProvider>
    </views:ItemDisplayList>

    <mx:DataGrid id="dg" width="100%" height="300" >
        <mx:dataProvider>
            {this._dataModel.itemList}
        </mx:dataProvider>
    </mx:DataGrid>
</mx:VBox>

CustomComponent имеет этот класс AS:

package code{

import model.DataModel;
import mx.containers.Canvas;

public class CustomComponent extends Canvas{

    [Bindable]
    private var _dataModel:DataModel = DataModel.getInstance();

    private var _dataProvider:ArrayCollection ;  

    public function CustomComponent(){
        super();
        _dataProvider = new ArrayCollection();
        trace("CustomComponent start");
    }

    public function get dataProvider() : ArrayCollection {
        trace("get dataProvider");
        return _dataProvider;
    }

    public function set dataProvider(value: ArrayCollection) : void {
        trace("set dataProvider");
        this._dataProvider = value;
        invalidateProperties();
        invalidateSize();
        invalidateDisplayList();
        dispatchEvent(new FlexEvent(FlexEvent.DATA_CHANGE));
   }

   ...


    override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number ) : void{
        trace("updateDisplayList");       
        super.updateDisplayList(unscaledWidth, unscaledHeight);         
    }
}
}

1 Ответ

0 голосов
/ 26 февраля 2010

Вы сбрасываете dataProvider в своем пользовательском компоненте, или, обновляя, вы подразумеваете добавление / удаление элемента из dataModel.itemList?

Если вы добавляете элемент в dataModel.itemList, то ваш пользовательский компонент не будет обновляться, но DataGrid будет обновляться. Это связано с тем, что в DataGrid (может быть, в базовом компоненте ListBase во Flex?), Когда вы set dataProvider, он добавляет прослушиватель событий для CollectionEvent.COLLECTION_CHANGE. Когда он слышит об этом (когда что-то в вашем ArrayCollection / IList изменяется, от remove / add / refresh / etc), он запускает несколько методов для обновления itemRenderers в DataGrid. Вам придется кодировать это вручную, если вы создадите собственное свойство dataProvider.

Если вы явно установили dataProvider на свой пользовательский компонент (custom.dataProvider = myArrayCollection), он обновится. Но это не самая эффективная вещь. Я рекомендую расширить один из классов List, в котором уже реализовано свойство dataProvider, и это очень сложно.

Проверьте источник для метода dataProvider mx ListBase , чтобы увидеть, что они сделали.

Надеюсь, это поможет, Lance

...