如何使用WPF TreeView来处理不同类型的嵌套对象

3

我有两个类想要在树形视图中显示。

在我的主窗口中,我有一个可观察的集合,存储着某种类型的对象,我们称之为对象a。 对象a包含另一种类型的可观察对象集合,对象b。 每个对象b都包含了一组可观察的对象b。

例如,我可能有如下数据结构

ListOfObjectA's

-ObjectA1

--ListOfObjectB's

---ObjectB

----ListOfObjectB's

-----ObjectB

-ObjectA2

--ListOfObjectB's

---ObjectB

我的XAML应该是什么样子来绑定像这样的树形视图呢?

如果我没有解释清楚,很抱歉,我是WPf新手。

2个回答

8

RB的想法是正确的。这就是WPF将模板应用于普通.NET对象的能力非常强大的地方。

您需要指定两个HierarchicalDataTemplates,一个用于类型为a的对象,另一个用于类型为b的对象。类似于这样:

<TreeView>
    <TreeView.Resources>
        <HierarchicalDataTemplate TargetType="{x:Type local:a}">
            <!-- XAML to display objects of type a -->
        </HierarchialDataTemplate>
        <HierarchicalDataTemplate TargetType="{x:Type local:b}">
            <!-- XAML to display objects of type b -->
        </HierarchicalDataTemplate>
    </TreeView.Resources>
</TreeView>

您需要为每个模板的ItemsSource属性指定绑定,以便WPF知道从哪里获取子对象。此外,您需要在根节点中添加一个xmlns声明,指定对象所在的命名空间(在上面的示例代码中表示为local)。


1

我对WPF的掌握已经足够娴熟,但是我相信HierarchicalDataTemplate一定能解决你的问题。虽然我在XAML方面还有点欠缺,但我无法为你编写出好的示例代码。以下是我在项目中使用HierarchicalDataTemplate的方式,希望这能给你提供一些好的思路。

<TreeView Grid.Row="1" 
          Grid.Column="1" 
          ItemsSource="{Binding Children}" 
          SelectedItemChanged="TreeView_SelectedItemChanged" 
          ContextMenu="{StaticResource MenuContextMenu}">

  <TreeView.ItemTemplate>
    <HierarchicalDataTemplate  ItemsSource="{Binding Children}" >
      <!--<TextBlock Text="{Binding Path=ItemName}" Margin="5,0,5,0" />-->
      <Grid  ContextMenu="{StaticResource ContextMenu}"   >
        <TextBlock  Name="ShownItem" 
                          Text="{Binding Path=ItemName}" 
                          Margin="0,0,0,0" />

          <TextBox Name="EditBox" 
                 Text="{Binding Path=ItemName}" 
                 Visibility="{Binding Path=Visibility}"
                 Style="{StaticResource EditableTextBox}" 
                 IsVisibleChanged="EditBox_IsVisibleChanged"
                 PreviewKeyDown="EditBox_KeyDown"
                 Margin="0,2,0,2"
                   >

              </TextBox>

      </Grid>
     </HierarchicalDataTemplate>
  </TreeView.ItemTemplate>
</TreeView>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接