Обновление HiearachicalData на основе обновлений исходного кода? - PullRequest
1 голос
/ 04 апреля 2011

У меня есть ArrayCollection, который мы будем называть «Предметы». По сути, это плоский набор иерархических данных (каждый элемент имеет свойства Parent и Children). Я хочу, чтобы AdvancedDataGrid отображал данные в иерархической форме, поэтому, по сути, я мог бы просто сделать это, и это выглядело бы нормально:

// Note: RootItems would be an ArrayCollection that is updated so only the
// top level items are within (item.Parent == null).
var hd:HierarchicalData = new HierarchicalData(model.RootItems);
var hcv:HierarchicalCollectionView = new HierarchicalCollectionView(hd);

myDataGrid.dataProvider = hdc;

Это работает, но я хочу видеть обновления в myDataGrid при обновлении коллекции Items (поскольку RootItems не будет получать обновления ни для каких дочерних элементов, только для задач верхнего уровня). Есть ли простой способ сделать это? Я предполагаю, что мне придется создать класс, который расширяет HierarchicalData и каким-то образом предупредить его, когда Items изменится, но звучит так, как будто это будет довольно медленно. Заранее благодарим за любую помощь, которую вы можете оказать!

1 Ответ

2 голосов
/ 04 апреля 2011

У вас есть два варианта решения этой проблемы. Либо вы создаете свою собственную реализацию IHierarchicalData (она не должна расширять HierarchicalData и в этом конкретном случае не будет большого количества кода, который вы сможете использовать повторно), либо вы немного меняете способ обработки своих данных, так что что он вписывается в стандартный вариант использования:

[Bindable] // make it bindable so that the HierarchicalCollectionView gets notified when the object changes
class Foo // your data class
{
    // this constructor is needed to easily create the rootItems below
    public function Foo(children:ArrayCollection = null)
    {
        this.children = children;
    }

    // use an ArrayCollection which dispatches an event if one of its children changes
    public var children:ArrayCollection;

    // all your other fields
}

// Create your rootItems like this. Each object can contain a collection of children
// where each of those can contain children of its own and so forth...
var rootItems:ArrayCollection = new ArrayCollection([
    new Foo(
        new ArrayCollection([
            new Foo(),
            new Foo(),
            new Foo(
                new ArrayCollection([
                    // ...
                ]),
            new Foo()
        ])
    ),
    new Foo(
        // ...
    ),
    // ...
]);

// Create the HierarchicalData and HierachicalCollectionView
var hd:IHierarchicalData = new HierarchicalData(rootItems);

[Bindable]
var hcv:IHierarchicalCollectionView = new HierarchicalCollectionView(hd);

Затем вы можете использовать hcv как dataProvider в своей ADG и использовать его методы для добавления и удаления элементов. ADG будет обновляться всякий раз, когда вы добавляете, удаляете или обновляете элемент.

Я предлагаю вам сделать это стандартным способом, если это действительно невозможно.

...