Скрытие узлов в компоненте гибкого дерева, оставляющего дочерние элементы видимыми - PullRequest
0 голосов
/ 10 апреля 2011

У меня есть дерево с поставщиком данных, которое принимает следующую форму:

<details name="Cars">
    <contact_person>aaaa</contact_person>
    <list>
        <car type="A">
            <car name="A1"/>
            <car name="A2"/>
        </car>
        <car type="B">
            <car name="B1"/>
            <car name="B2"/>
        </car>
    </list>
</details>

Я хочу, чтобы дерево показывалось вот так

Cars
     A
          A1
          A2
     B
          B1
          B2

То есть я хочу спрятать узлы contact_person и list. Удаление узлов из провайдера данных сделать невозможно. Поэтому я создал собственный дескриптор данных дерева, расширив DefaultDataDescriptor. Затем переопределил метод getChildren и применил функцию фильтра. в коллекцию, возвращаемую super.getChildren. Проблема в том, что когда я скрываю узел «список», я не могу показать дочерние узлы. Так есть ли способ, которым я могу скрыть «список», но показать потомков «узла»?

1 Ответ

0 голосов
/ 10 апреля 2011

Передача XML как dataProvider хороша для демонстраций и не работает, когда речь идет о реальном продукте.Обычной практикой является синтаксический анализ XML в строго типизированные объекты:

public class Details 
{ 
    public function Details(xml:XML)
    {
        label = xml.@name;
        var childrenArray:Array = [];
        for each (var carNode:XML in xml.list.car)
        {
            childrenArray.push(new CarType(carNode));
        }
        children = new ArrayCollection(childrenArray);
    }

    [Bindable]
    public var label:String;

    [Bindable]
    public var children:ArrayCollection /* of CarType */;
}

public class CarType
{
    public function CarType(xml:XML)
    {
        label = xml.@type;
        var childrenArray:Array = [];
        for each (var carNode:XML in xml.car)
        {
            childrenArray.push(new Car(xml));
        }
        children = new ArrayCollection(childrenArray);
    }

    [Bindable]
    public var label:String;

    [Bindable]
    public var children:ArrayCollection /* of Car */;
}

public class Car
{
    public function Car(xml:XML)
    {
        label = xml.@name;
    }

    [Bindable]
    public var label:String;
}

Использование:

var xml:XML = <details name="Cars">...</details>;
var details:Details = new Details(xml);
var tree:Tree = new Tree();
tree.dataProvider = new ArrayCollection([ details ]);

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...