2009-05-27 5 views
0

Я бы хотел, чтобы данные, предоставленные DataGrid, решили, как лучше всего это сделать (т. Е. Пусть данные переносят с собой объект, который будет выполнять рендеринг).Flex ItemRenderer как поле `data`?

Например, путь создания «визуализируемый» интерфейс, который имеет «рендерер: IFactory» свойство, то используется, как показано ниже:

<mx:DataGrid x="0" y="0" width="100%" dataProvider="{myDataProvider}"> 
    <mx:columns> 
    <mx:DataGridColumn headerText="Task" width="100" 
     itemRenderer="{(data as Renderable).renderer}"/> 
    </mx:columns> 
</mx:DataGrid> 

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

Я также попытался с помощью:

itemRenderer="{(data as Renderable).getRenderer()}" 

Который ничего не делает (на самом деле, метод getRenderer никогда не вызывается).

Есть ли лучший способ сделать это? Я делаю что-то принципиально неправильно?

Спасибо!

ответ

2

Я мог бы быть неправильно, но я думаю, что свойство «Данные» вы ссылки в примере кода выше является «данные» для контейнера верхнего уровня в вашей точки зрения а не для этой конкретной строки DataGrid. Приходят еще несколько подходов:

  1. Внедрение класса рендеринга элемента, который анализирует передаваемые ему данные, и использует соответствующий инструмент визуализации элементов для типа данных.
  2. Внедрите функцию в представлении вашего DataGrid, которая проверяет ваш dataProvider и возвращает класс класса рендеринга элемента; вызовите это внутри свойства DataGridColumn.itemRenderer, используя выражение привязки.
  3. Внедрите подкласс DataGridColumn, который имеет логику, испеченную в нем, чтобы установить правильный itemRenderer.

Я бы рекомендовал не смешивать данные «рендеринга», которые зависят от вида с данными вашей модели. Если вы не привяжете данные базовой модели к объекту, который предоставляет его вместе с рендерером (что некоторые люди называют ViewModel).

+0

Спасибо за ответ. Причина, по которой я хочу поставить данные смешения, и взгляд таким образом заключается в том, что может быть другой тип данных, выходящих из провайдера, и я думаю, что будет наименьшая общая связь, если каждая точка данных знает, как сделать ее сам. –

0

Сделать getRenderer а [Bindable] свойство

+0

Пробовал, что - нет любви. Похоже, по крайней мере одна из проблем заключается в том, что привязки «не работают», хотя приведение. Например, «{(данные как Foo) .bar}» в ItemRenderer не будет связываться, тогда как {data.bar} будет связываться. –

+0

Bindings через приведение * do * работа. Это необходимо, особенно если вы компилируете с помощью -compiler.show-actionscript-warnings и -compiler.show-binding-warnings. Убедитесь, что вы привязываетесь к объекту getter, а не к функции. – an0nym0usc0ward

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