PDA

Просмотр полной версии : изменение dataProvider в List при изменении источника


Silicium
06.07.2012, 22:14
Добрый вечер. Как лучше обновлять dataProvider при изменении массива, являющегося моделью для данного списка. Варианта я вижу два:
1) при каждом изменении массива source писать list.dataProvider = new ArrayList(source);
2) не создавать новый ArrayList, а добавлять/обновлять/удалять элементы, соответствующие изменившимся;
какой лучше? (для простоты кода использую первый, но не уверен, что разумно).

Astraport
06.07.2012, 23:40
Вы используете dataProvider как Bindable?
Если да, то делайте с ним что хотите - все должно правильно отразиться (за исключением использования в list itemRenderer - тут возможны заморочки).

Silicium
07.07.2012, 01:06
Возражу: использование Bindable (свойство dataProvider и так можно использовать для привязки) будет решать проблему тогда, когда оно привязано к какому-то полю IList при его изменении (при изменении ссылки, а не содержимого). В моем случае есть модель, в которой есть массив (не IList). К нему нельзя привязать dataProvider. Поэтому приходится пользоваться одним из предложенных мною способов. Так что вопрос открыт: какой предпочтительнее?

djyamato
08.07.2012, 00:03
а почему обязательно массив? Почему бы не использовать ArrayCollection, например, каждый из элементов которого некий объект, свойства которого тоже [Bindable] ?

Silicium
08.07.2012, 00:39
Потому, что это модель. Там нет конкретики того, как это будет отображаться. Поэтому наиболее абстрактно (и логично) хранить эти данные стоит в массиве. В принципе можно, конечно (я об этом уже подумывал), использовать коллекцию, но не хочется привязываться к какой-то флексовой реализации IList или писать свою.

djyamato
08.07.2012, 01:23
Хм, а зачем тогда флекс ?
P.S. В ArrayCollection я тоже не вижу особой конкретики, это некое хранилище, которое рассылает события о своем изсенении.

P.P.S. Ну если уж и ArrayCollection не подходит, отнаследуйтесь от Array, напишите свои события изменения этого массива (тот же самый ArrayCollection и получится)

alatar
08.07.2012, 15:40
Потому, что это модель. Там нет конкретики того, как это будет отображаться. Поэтому наиболее абстрактно (и логично) хранить эти данные стоит в массиве.
Это у вас получился Value Object, а не модель. Модель, в отличие от VO, должна сообщать о своем изменении.

Silicium
08.07.2012, 17:07
Ну да, она сообщает, что в ней изменился массив данных. И обработчик события изменения изменяет вид, по первому способу:
list.dataProvider = new ArrayList(source);

P.P.S. Ну если уж и ArrayCollection не подходит, отнаследуйтесь от Array, напишите свои события изменения этого массива (тот же самый ArrayCollection и получится)
Фактически, это второй способ, только инкапсулированный в класс коллекции. Опять же, не хотел, чтобы в модели использовался тип коллекции только потому, что так удобно виду.

alatar
08.07.2012, 17:32
Опять же, не хотел, чтобы в модели использовался тип коллекции только потому, что так удобно виду.
Используйте интерфейсы. На данный момент ни один компонент не требует прямого указания типа модели (а dataProvider это и есть модель для компонента). В итоге вы пытаетесь сделать модель для модели плодя лишние сущности. KISS (http://ru.wikipedia.org/wiki/KISS_(%D0%BF%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF)).