3 Stimmen

ItemRender Daten ändern

Ich habe eine Liste mit einem ItemRenderer. Wenn ich auf eine Schaltfläche klicke, dann wird eine Eigenschaft der ArrayCollection, die ich an die Liste gebunden habe, geändert.

Wenn ich auf die Schaltfläche klicke, wird die Eigenschaft geändert, aber die Liste ändert sich nicht.

Wie kann ich das Problem lösen?

Hier ist mein Code

<fx:Script>
    <![CDATA[

        [Bindable] 
        public var controllers:ControllerCollection = new ControllerCollection();

        private function hideTheFirstItem(evt:MouseEvent):void
        {
            (controllers[0] as Controller).meetsRequirements = false;

                    //these methods don't work unfortunatly
                    controllers.itemUpdated(controllers[0]);
                    controllers.refresh();

        }

    ]]>
</fx:Script>

<mx:List id="listControllers" dataProvider="{controllers}">
    <mx:itemRenderer>
        <fx:Component>
            <solutionItems:displaySolutionItem visible="{data.meetsRequirements}" />
        </fx:Component>
    </mx:itemRenderer>
</mx:List>
<mx:Button label="test" click="hideTheFirstItem(event)" />

(ControllerCollection erweitert ArrayCollection)

Danke!

Vincent

2voto

JeffryHouser Punkte 39293

Zwei Möglichkeiten:

  1. collection.refresh()
  2. collection.itemUpdated()

Natürlich ist ControllerCollection keine Standard-Flex-Sammlungsklasse; daher nehme ich einfach an, dass sie die ICollectionView-Schnittstelle implementiert.


Aktualisierung: Ich stelle fest, dass Ihr Code so eingestellt ist, dass er das erste Element der ArrayCollection ändert

private function hideTheFirstItem(evt:MouseEvent):void
{
 (controllers[0] as Controller).meetsRequirements = false;

 //these methods don't work unfortunatly
 controllers.itemUpdated(controllers[0]);
 controllers.refresh();
}

Ich wollte sicherstellen, dass das erste Element der Sammlung nicht das erste Element ist, das in der Ansicht sichtbar ist. Ich frage mich, ob das bei Ihnen zu Problemen führt.

2voto

Brian Genisio Punkte 47135

Ohne Ihren Objekt-Renderer zu sehen, muss ich einige Annahmen treffen.

Zunächst gehe ich davon aus, dass Ihr Element-Renderer die Datenbindung mit der meetsRequirements Eigentum. Wenn dies der Fall ist, dann muss die meetsRequirements Eigenschaft benachrichtigt werden muss, wenn sich diese Eigenschaft ändert. Wenn Sie die [Bindable] Tag auf diese Eigenschaft oder die Controller Klasse, dann wird die meetsRequirements wird der itemRenderer benachrichtigt, das Feld auf der Grundlage Ihrer Datenbindung zu aktualisieren.

Wenn meine Annahmen falsch sind, müssen wir den Code sehen, um Ihnen weitere Informationen zu geben.

1voto

Jason Towne Punkte 7844

Versuchen Sie dies:

<fx:Script>
    <![CDATA[

        [Bindable(Event="refreshMyList")] 
        public var controllers:ControllerCollection = new ControllerCollection();

        private function hideTheFirstItem(evt:MouseEvent):void
        {
            (controllers[0] as Controller).meetsRequirements = false;

            dispatchEvent(new Event("refreshMyList"));
        }

    ]]>
</fx:Script>

1voto

J_A_X Punkte 12842

Versuchen Sie erstens nicht, neue Sammlungen anzulegen, wenn Sie es nicht müssen.

Ich glaube, Ihr Problem liegt in dieser Aussage: (controllers[0] as Controller).meetsRequirements = false; die beim Kompilieren fehlschlagen sollte, weil ein Element der Sammlung nicht mit der eckigen Klammer abgerufen werden kann. Sie müssen verwenden getItemAt(index:int) Funktion.

Darüber hinaus würden Sie nicht wollen, um sichtbar auf false, um ein Element Renderer, wenn Sie wollen, "entfernen" es, weil dann würden Sie eine leere Stelle haben. Was Sie tun wollen, ist, es herauszufiltern:

<s:Application creationComplete="onCreationComplete()">
    <fx:Script>
        <![CDATA[
            import mx.collections.ArrayCollection;

            [Bindable] public var data:ArrayCollection = new ArrayCollection();

            private function onCreationComplete():void
            {
                // TODO: need to add data here
                // Adding filter function
                data.filterFunction = filterItems;
            }

            private function filterItems(item:Object):Boolean
            {
                return item.meetsRequirements;
            }

            private function hideFirstItem():void
            {
                if(data.length > 0)
                {
                    Controller(data.getItemAt(0)).meetsRequirements = false;
                }

                data.refresh();
            }
        ]]>
    </fx:Script>

    <mx:List id="listControllers" dataProvider="{data}" />
    <mx:Button label="test" click="hideFirstItem()" />
</s:Application>

Das sollte genügen. Allerdings ungetestet.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X