具有多个子项的分层树

时间:2011-09-27 21:45:18

标签: wpf mvvm tree hierarchicaldatatemplate

我试图围绕如何使用MVVM模式解决WPF中的这个问题。

我正在将win32树控件转换为WPF。旧树控件沿着这些行使用Node类层次结构(BaseNode是基类,并且每个后续项继承自它并略微扩展): BaseNode,GroupNode,VehicleNode,PersonNode,EquipmentNode,SupplyNodes(等等)

从这里开始,GroupNode将有一个子节点列表,可以是一个或多个GroupNode,一个或多个VehicleNode以及一个或多个PersonNode。

VehicleNode将有一个PersonNode列表,这些PersonNode将成为操作车辆的工作人员。 VehicleNode还将具有将成为车辆中的乘客的PersonNode列表。其中每一个都在一个标记为船员和乘客的“虚拟”节点下(尽管它们都是PersonNode类型)。

除此之外,VehicleNode和PersonNode都将拥有EquipmentNodes和SupplyNodes。

树将有几个“组”节点,这些节点将被展开以列出该类型的任何项目。

希望这个文本图有助于解决问题。

  • 地面舰队(GroupNode)
    • West Coast(GroupNode)
    • 东海岸(GroupNode)
      • Truck 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)
        • 推销员Tom(PersonNode)
        • 区域经理Sally(PersonNode)
因此,Truck 2(VehicleNode)的实例有六个不同类型的子节点(BaseNodes列表): 列出儿童; // {Bill The Driver(PersonNode),Passenger 1(PersonNode),Passenger 2(PersonNode),Jack(EquipmentNode),Tyre Iron(EquipmentNode),SpareTire(SupplyNode)}

在我们现有的win32树中,当我们添加Truck 2节点时,我们手动循环子节点并添加虚节点(根据需要)和子节点,根据子节点列表中的节点类型创建树可能是子节点上的一个属性 - PersonNode上有一个标志,表明它是乘客还是乘员,所以我们知道要添加它的哪个父节点属于。

我正在努力解决如何在树上的MVVM方法中表示这种方法,这样我们就可以保留上面的虚拟节点。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

使用HierarchicalDataTemplate,请参阅一个不错的示例here

您将从ViewModel公开节点列表,并将其绑定到TreeView的ItemsSource。每个节点还有一个子属性,它是另一个节点列表。

如果需要在每个节点上放置ICommands / Actions / Methods,每个节点都可以只是一个简单的类,或者实际上可能是ViewModels。

您可以在ViewModel的C#中设置每个节点,因为HierarchicalDataTemplate会为您完成很多绑定工作。