2

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

我正在将一个 win32 树控件转换为 WPF。旧的树控件沿这些线使用节点类层次结构(BaseNode 是基类,并且从它继承并略微扩展的每个以下项):BaseNode、GroupNode、VehicleNode、PersonNode、EquipmentNode、SupplyNodes (等等)

由此,GroupNode 将有一个子节点列表,可以是一个或多个 GroupNode、一个或多个 VehicleNode 和一个或多个 PersonNode。

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

除此之外,VehicleNode 和 PersonNode 将分别具有 EquipmentNodes 和 SupplyNodes。

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

希望此文本图将有助于解决说明问题。

  • 地面舰队(GroupNode)
    • 西海岸 (GroupNode)
    • 东海岸 (GroupNode)
      • 卡车 1(VehicleNode)
      • 卡车 2(VehicleNode)
        • 船员(DummyNode)
          • 给司机开账单(PersonNode)
        • 乘客(虚拟节点)
          • 乘客 1 (PersonNode)
          • 乘客 2 (PersonNode)
            • 设备(DummyNode)
              • 相机(设备节点)
              • 太阳镜(设备节点)
            • 耗材(虚拟节点)
              • 苹果(供应节点)
              • 水瓶(SupplyNode)
          • 设备(DummyNode)
            • 杰克(设备节点)
            • 轮胎熨斗(设备节点)
          • 耗材(虚拟节点)
            • 备用轮胎(供应节点)
      • 人员(DummyNode)
        • 推销员汤姆(PersonNode)
        • 区域经理 Sally (PersonNode)
所以 Truck 2 (VehicleNode) 的实例有六个不同类型的子节点(BaseNodes 列表): List children;// {Bill The Driver(PersonNode)、Passenger 1 (PersonNode)、Passenger 2 (PersonNode)、Jack (EquipmentNode)、Tire Iron (EquipmentNode)、SpareTire (SupplyNode)}

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

我正在努力研究如何在树上的 MVVM 方法中表示这将允许我们保留上述虚拟节点。

任何帮助将不胜感激!

4

1 回答 1

0

使用HierarchicalDataTemplate ,在此处查看一个不错的示例。

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

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

每个节点都可以根据您的需要在 ViewModel 中的 C# 中进行设置,因为 HierarchicalDataTemplate 为您做了很多绑定工作。

于 2011-09-27T23:30:15.750 回答