Невозможно привязать предупреждение: класс не является IEventDispatcher

#apache-flex #actionscript-3 #data-binding

#apache-flex #actionscript-3 #привязка данных

Вопрос:

Я нашел другой похожий вопрос, но не совсем следую приведенному там объяснению и не уверен, применимо ли оно ко мне.

Я получаю ошибку:
предупреждение: не удается привязать к свойству ‘Description’ в классе ‘Object’ (класс не является IEventDispatcher)

однако это происходит только тогда, когда данные привязаны к списку в виде ArrayList. Раньше он был у меня в Datagrid (просто как массив), и это не вызвало никаких проблем. Я не ожидаю, что смогу привязать какие-либо данные обратно к классу ‘object’, даже не уверен, к какому именно объекту это относится.

Мой поставщик данных списка — ArrayList.. заполняется результирующим событием из SQL-запроса, содержащегося в другом классе:

    private function loadDayComplete():void
        {   
            var Meals:Array = _day.MealResults;
            var MealsListResult:ArrayList = new ArrayList(Meals);
            MealPanelDataGrid.dataProvider = Meals;
            MealListView.dataProvider = MealsListResu<
        {
  

Класс day, который у меня есть, является держателем данных для получения всех данных (из нескольких таблиц) за 24-часовой промежуток.. У меня есть классы для каждого отдельного типа данных для их редактирования.
Но я не уверен, нужно ли мне вообще беспокоиться о предупреждении, если я не планирую редактировать значения? он полностью рассылает спам на консоль, хотя всякий раз, когда я к чему-либо прикасаюсь, поэтому я действительно хотел бы избавиться от него.
Я попробовал объектный прокси, как я видел, описанный в другом месте, но ничего не изменилось. И я довольно смущен, почему это внезапно стало проблемой в компоненте списка, когда этого не было в datagrid… Текст в любом случае сейчас находится в полях меток, которые даже не могут быть отредактированы.

Ответ №1:

Объекты, вызывающие это предупреждение, вероятно, являются элементами внутри Meals массива. Убедитесь, что эти элементы строго типизированы (шаблоны объектов передачи данных / объектов значений) и что Description поле помечено [Bindable] .

В зависимости от используемого вами механизма удаленного взаимодействия вы можете использовать что-то вроде флага makeObjectsBindable, который заменяет возвращаемые Object элементы на привязываемые ObjectProxy экземпляры.

Но я все равно посоветую строгий ввод.

Комментарии:

1. Я добавил [Bindable] ко всем переменным во всех создаваемых классах (их было 2), и теперь это работает! отлично.

2. ObjectProxy удобен для быстрых решений. Но я согласен с Иво Банасом в том, что вам следует отдавать предпочтение строго типизированным объектам с правильными связываемыми свойствами — если вы это сделаете, то получите хорошую поддержку компилятора. Я бы также рекомендовал для повышения производительности не использовать общий тег [Binding], а вместо этого использовать шаблон [Binding(«customChangeEvent»)]. Это снижает «штормы» событий привязки, влияющих на производительность, позволяя компилятору узко фокусировать прослушиватели событий. По этой причине вы видите это во всем собственном коде Adobe.

Ответ №2:

Вы можете избавиться от него, создав свой dataProvider an EventDispatcher : ObjectProxy is EventDispatcher . Он автоматически перенесет ваши данные на заданную или бесконечную глубину (поведение по умолчанию).

 metaPanelDataGrid.dataProvider = new ObjectProxy(meals);
  

Это в основном то же самое, что и с ArrayCollection , но глубже.