Иерархическое дерево с несколькими подэлементами - PullRequest
2 голосов
/ 28 сентября 2011

Я пытаюсь понять, как решить эту проблему в WPF с использованием шаблона MVVM.

Я конвертирую элемент управления дерева win32 в WPF. Старый элемент управления дерева использует иерархию классов Node вдоль этих линий (BaseNode является базовым классом и каждый следующий элемент наследуется от него и немного расширяется): BaseNode, GroupNode, VehicleNode, PersonNode, EquipmentNode, SupplyNodes (и т. Д. И т. Д.)

Исходя из этого, у GroupNode будет список дочерних узлов, которые могут быть одним или несколькими GroupNodes, одним или несколькими VehicleNodes и одним или несколькими PersonNodes.

VehicleNode будет иметь список PersonNode, который будет командой для управления транспортным средством. У VehicleNode также будет список PersonNode, которые будут пассажирами в транспортном средстве. Каждый из них находится под узлом «Пустышка» с надписью «Экипаж и пассажиры» (хотя оба они являются типами PersonNode).

Помимо этого, каждый из VehicleNode и PersonNode должен иметь узлы EquipmentNode и SupplyNodes.

В дереве будет несколько "групповых" узлов, которые будут расширены для перечисления любых элементов этого типа.

Надеюсь, эта текстовая диаграмма поможет решить проблему с иллюстрацией.

  • Наземный флот (GroupNode)
    • Западное побережье (GroupNode)
    • Восточное побережье (GroupNode)
      • Грузовик 1 (VehicleNode)
      • Грузовик 2 (VehicleNode)
        • Экипаж (DummyNode)
          • Билл Водитель (PersonNode)
        • Пассажиры (DummyNode)
          • Пассажир 1 (PersonNode)
          • Пассажир 2 (PersonNode)
            • Оборудование (DummyNode)
              • Камера (EquipmentNode)
              • Солнцезащитные очки (EquipmentNode)
            • Расходные материалы (DummyNode)
              • Apple (SupplyNode)
              • Бутылка для воды (SupplyNode)
          • Оборудование (DummyNode)
            • Джек (EquipmentNode)
            • Шинный железо (EquipmentNode)
          • Расходные материалы (DummyNode)
            • SpareTire (SupplyNode)
      • Персонал (DummyNode)
        • Продавец Том (PersonNode)
        • Районный менеджер Салли (PersonNode)
Таким образом, экземпляр Truck 2 (VehicleNode) имеет шесть дочерних узлов (список базовых узлов) различных типов: Список детей; // {Билл Водитель (PersonNode), Пассажир 1 (PersonNode), Пассажир 2 (PersonNode), Джек (EquipmentNode), Железо в шинах (EquipmentNode), SpareTire (SupplyNode)}

В нашем существующем дереве win32, когда мы добавляем узел Truck 2, мы вручную циклически перебираем дочерние узлы и добавляем фиктивные узлы (при необходимости) и дочерние элементы, чтобы создать дерево на основе типа узлов в списке дочерних элементов и потенциально свойство дочернего узла - у PersonNode есть флаг, указывающий, является ли он пассажиром или экипажем, поэтому мы знаем, к какому родительскому узлу его добавить.

Я борюсь с тем, как это можно представить в подходе MVVM к дереву, которое позволило бы нам сохранить фиктивные узлы, как указано выше.

Любая помощь будет принята с благодарностью!

1 Ответ

0 голосов
/ 28 сентября 2011

Использование HierarchicalDataTemplate , см. Приличный пример здесь .

Вы бы выставили список узлов из вашей ViewModel и связали бы его с ItemsSource TreeView,Каждый узел также будет иметь дочернее свойство, представляющее собой другой список узлов.

Каждый из вас может быть простым классом или фактически представлять собой сами ViewModels, если вам нужно размещать ICommands / Actions / Methods на каждомnode.

Каждый узел может быть настроен так, как вы хотите в C # в вашей ViewModel, так как HierarchicalDataTemplate выполняет за вас большую работу по связыванию.

...