C# 如何对不同类型的嵌套对象使用wpf treeview

C# 如何对不同类型的嵌套对象使用wpf treeview,c#,wpf,treeview,C#,Wpf,Treeview,我有两门课想在树状视图中展示 在我的主窗口中,我有一个特定类型对象的可观察集合,称之为对象a。 对象a包含另一类对象(对象b)的可观察集合。 每个对象b包含对象b的可观察集合 例如,我可能有这样的东西 对象列表 -对象1 --对象的列表 ---反对意见 ----对象的列表 -----反对意见 -对象2 --对象的列表 ---反对意见 将treeview绑定到类似的东西时,我的xaml应该是什么样子的 抱歉,如果我没有解释清楚,我是wpf新手。我知道wpf非常危险,但我非常确定Hierarchyc

我有两门课想在树状视图中展示

在我的主窗口中,我有一个特定类型对象的可观察集合,称之为对象a。 对象a包含另一类对象(对象b)的可观察集合。 每个对象b包含对象b的可观察集合

例如,我可能有这样的东西

对象列表

-对象1

--对象的列表

---反对意见

----对象的列表

-----反对意见

-对象2

--对象的列表

---反对意见

将treeview绑定到类似的东西时,我的xaml应该是什么样子的


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

我知道wpf非常危险,但我非常确定HierarchycalDataTemplate是解决您问题的方法。我的XAML技能还不确定,所以我不能为您编写好的示例代码。下面是我如何在项目中使用HierarchycalDataTemplate的。我希望这能给你一些好主意

<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>


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

您需要指定两个
层次数据模板
,一个用于
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
表示)