Изменение данных ItemRender - PullRequest
3 голосов
/ 09 мая 2011

У меня есть список с ItemRenderer. Когда я нажимаю кнопку, свойство привязанной к списку коллекции ArrayCollection изменяется.

Когда я нажимаю кнопку, это меняет свойство, но список не меняется.

Как мне решить эту проблему.

Вот мой код

<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 расширяет ArrayCollection)

Спасибо!

Vincent

Ответы [ 4 ]

2 голосов
/ 09 мая 2011

Не видя вашего средства визуализации элементов, мне нужно сделать некоторые предположения.

Сначала я предположу, что ваше средство визуализации элементов использует привязку данных к свойству meetsRequirements.Если это так, то свойство meetsRequirements должно уведомлять об изменении этого свойства.Если вы добавите тег [Bindable] к этому свойству или классу Controller, то свойство meetsRequirements уведомит itemRenderer об обновлении этого поля на основе вашей привязки данных.

Если мои предположения неверны,нам нужно увидеть код, чтобы дать вам дальнейшие мысли.

2 голосов
/ 09 мая 2011

Два способа:

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

Конечно, ControllerCollection не является стандартным классом Flex Collection; поэтому я просто предполагаю, что он реализует интерфейс ICollectionView.


Обновление: Я заметил, что ваш код настроен на изменение первого элемента ArrayCollection

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

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

Я хотел быть уверен, что указал, что первый элемент коллекции может не быть первым элементом, видимым в данный момент в представлении. Интересно, это вызывает у вас проблемы?

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

Во-первых, не пытайтесь создавать новые коллекции, если вам это не нужно.

Я полагаю, что ваша проблема заключается в следующем утверждении: (controllers[0] as Controller).meetsRequirements = false;, которое должно произойти сбой при компиляции, потому что элемент коллекции не может быть получен с помощью аннотации в квадратных скобках.Вам нужно использовать функцию getItemAt(index:int).

Кроме того, вы не захотите устанавливать видимое значение false для средства визуализации элементов, если хотите «удалить» его, потому что тогда у вас будет пустое место.То, что вы хотите сделать, это отфильтровать это:

<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>

Это должно сделать это.Хотя не проверено.

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

Попробуйте это:

<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>
...