2010-03-23 2 views
0

Вид новичка Flex здесь, так что несите меня. У меня есть DataGrid определяется следующим образом:Имя столбца DataGrid не похоже на привязку

<mx:Script> 
... 
private function getColumns(names:ArrayCollection):Array { 
    var ret:Array = new Array(); 
    for each (var name:String in names) { 
     var column:DataGridColumn = new DataGridColumn(name); 
     ret.push(column); 
    } 
    return ret; 
} 
</mx:Script> 
<mx:DataGrid id="grid" width="100%" height="100%" paddingTop="0" 
    columns="{getColumns(_dataSetLoader.columnNames)}" 
    horizontalScrollPolicy="auto" labelFunction="labelFunction" 
    dataProvider="{_dataSetLoader.data}" 
/> 

... где _dataSetLoader является экземпляром объекта, который выглядит как:

[Bindable] 
public class DataSetLoader extends EventDispatcher { 
    ... 
    private var _data:ArrayCollection = new ArrayCollection(); 
    private var _columnNames:ArrayCollection = new ArrayCollection(); 
    ... 
    public function reset():void { 
     _status = NOTLOADED; 
     _data.removeAll(); 
     _columnNames.removeAll(); 
    } 
    ... 

При сбросе() вызывается на экземпляре dataSetLoader, DataGrid очищает данные в ячейках, как и ожидалось, но оставляет имена столбцов, даже если reset() вызывает _columnNames.removeAll(). Не должно ли изменение в коллекции инициировать изменение в DataGrid?

ответ

0

Ваши данные правильно связаны, потому что вы обращаетесь непосредственно к переменной как dataProvider. Для столбцов вы можете обратиться к вызову функции.

Можете ли вы присвоить значения _dataSetLoader.columnNames вместо bindable ArrayCollection? Затем используйте ArrayCollection как столбцы.

+0

Ну, столбцы - это массив, а не массив ArrayCollection. Но, во всяком случае, я также попытался добавить массив класса _columnNamesAsArray в класс DataSetLoader, ссылаясь на это в предложении column = и опустошая его в reset(), но получив тот же результат. Кроме того, я понимаю, что привязка данных работает и через вызовы функций, если аргумент функции связан? То есть, изменение _columnNames должно вызвать вызов getColumns(). Неужели я ошибаюсь? – Jason

0

Ну, есть различные альтернативы или работы вокруг. Это зависит от вашего требования.

Ниже то, что вы можете сделать с DataGrid компонента

  1. Если вы уже знаете имена столбцов т.е. в интерфейсе UI имена столбцов не изменяются. Вы можете захотеть их жестко закодировать, а не динамически.

  2. Если имя столбца изменяется с помощью массива или датаподатчика, я предлагаю удалить свойство столбца вашего datagrid и дать возможность отображать имена столбцов по умолчанию.

  3. Вы также можете добавить столбцы во время выполнения в зависимости от входов, предоставляемых раскрывающимися или флажками или некоторыми другими условиями.

Отъезд Flex Documentation для получения дополнительной информации.

+0

Да, ни один из этих вариантов не работает для меня. DataGrid в основном реализует CSV-ридер. Первая строка CSV - это имена столбцов, вторая строка - типы полей, а остальные строки - данные. Таким образом, имена столбцов меняются все время, в зависимости от прочитанного файла. Вот почему я хотел бы хранить их в ArrayCollection и использовать привязку данных для управления обновлениями представления. – Jason

+0

Если вы не отфильтровываете какие-либо столбцы, тогда вариант 2 должен работать. – 2010-03-24 00:01:46

Смежные вопросы