2012-02-08 3 views
0

Я использую AdvancedDataGrid для отображения иерархических данных. DataProvider - это объект, а поле children - ArrayCollection объектов. Когда я обновляю один из объектов в ArrayCollection, я бы хотел обновить сетку.Flex: изменения свойств объекта не обновляются. AdvancedDataGrid

После исследования я понимаю, что это произойдет не автоматически. Даже если я использую itemUpdated(), а затем обновляю AC. Даже если я вызываю executeBindings (рекурсивный).

Я знаю, что для того, чтобы быть умным, я должен был использовать ObjectProxy все время, так как это решило бы все мои проблемы. Теперь моя проблема заключается в том, как я могу это исправить без полной перестройки моих объектов иерархических данных?

Я попробовал, чтобы мои объекты Value расширяли ObjectProxy, но это не помогло. Есть ли элегантное решение? Могут ли набранные объекты использовать класс ObjectProxy?

Спасибо за любые полезные советы.

Вот код HierarchicalData:

<mx:HierarchicalData 
    source="{model.myObject}" 
    childrenField="trades"/> 

Вот 'MyObject' Класс:

[Bindable] 
public class MyObject implements ValueObject 
{ 
    public var qty:Number; 
    public var status:String; 
    public var comments:String; 
    public var modified_by:String; 
    public var modified_date:Date; 
    public var trades:ArrayCollection = new ArrayCollection(); 
} 

ArrayCollection 'торгов имеет кучу торговых объектов, определенных здесь:

[Bindable] 
public class Trade implements ValueObject 
{ 
    public var selected:Boolean = false; 
    public var quantity:Number; 
    public var modified_by:String; 
    public var modified_date:Date; 

} 

И вот как я заполняю коллекцию после того, как сервер вернет данные:

for (var i:int=0;i<result.length;i++){ 
       var item:Object = result[i]; 

       var recall:MyObject  = new MyObject(); 
       recall.comments    = item.comments; 

       recall.qty     = item.qty; 
       recall.status     = item.status; 
       recall.modified_by   = item.modified_by; 
       recall.modified_date   = item.modified_date; 

       recall.trades.addItem(item.trades); 

       model.recalls.addItem(recall); 
      } 
+0

1. Вы пытались установить DataSource (HierarchicalData) как Bindable. 2. Если вы знаете, когда ваш источник данных меняется, почему бы не вызвать myDG.invalidateList()? –

+0

Я обновил код выше, чтобы показать больше деталей. Вы можете видеть, что мой источник данных связывается; типизированные классы являются связываемыми. Я не знаю, где я могу ошибиться. И да, я вызвал invalidateList() в том же месте, где я попытался вызвать executeBindings (рекурсивный). – fumeng

+0

Во-первых, это 'источник' вашего' HierarchicalData' действительно просто объект ('model.myObject'), или это ошибка, и должна быть' model.recalls'? Во-вторых, когда вы используете типизированные объекты, вам не нужен объект ObjectProxy. Если все связано и вы используете 'ArrayCollection', ADG должен обновлять свои столбцы автоматически. Итак, какой вид обновления вы ожидаете, чего не происходит? Можете ли вы предоставить простой, управляемый пример? –

ответ

0

Вам просто нужно использовать привязываемый ArrayCollection в dataProvider для AdvancedDataGrid. Вы можете посмотреть пример here

+0

Вот что я делаю. Я добавил свой код выше, чтобы вы могли видеть. – fumeng

0

У меня была эта проблема всего неделю назад. Я наконец-то нашел решение (это в моем initialisationComplete обработчик моего приложения):

// lets create the model 
model = new ArrayCollection(); 
testPlanHierarchy = new HierarchicalData(); 

// lets create the bindings 
BindingUtils.bindProperty(testPlanHierarchy,"source",this,"model"); 
BindingUtils.bindProperty(testPlanADG,"dataProvider",this,"testPlanHierarchy") 

testPlanADG моя AdvancedDataGrid, конечно, и мой model является ArrayCollection типизированных объектов.

Элементов с [Bindable] тегом:

  • model
  • типизированных объекты классов
Смежные вопросы