我正在尝试创建一个包含不同对象类型的TreeView结构 . 它基本上就像Visual Studio的解决方案浏览器(在它下面的项目解决方案,在项目下有属性,引用,文件夹等,每个都有不同的上下文菜单,当底层结构发生更改时,TreeView会更新:添加新文件 . )

我有一个项目对象 . 其中包含名称,路径和其他对象列表(输入文件,输出文件等是自定义类) .

我想将它显示为TreeView上的结构,具有特定的ContextMenues和基于其类型的双击事件 .

Project_Name
|-Inputs => ContextMenu => Add => opens dialog to add a new input file
|  |-Input1 => Double click will open a dialog to edit this input file
|  |-Input2
|  |-...
|-Outputs
   |-Output1 => Double click will open a dialog to edit this output file 
   |-Output2

假设我使用上下文菜单添加一个新的输入文件来打开新的输入文件对话框,一旦完成,我希望更新TreeView以显示输入文件 .


更新1

我创建了一些HierarchicalDataTemplates

<Window.Resources>
    <HierarchicalDataTemplate DataType="{x:Type project:ETLProject}" ItemsSource="{Binding Path=InputDefinitions}">
        <TextBlock Text="Project"/>
    </HierarchicalDataTemplate>
    <HierarchicalDataTemplate DataType="{x:Type inputdef:InputDefinition}" ItemsSource="{Binding Path=Columns}">
        <TextBlock Text="{Binding Path=Name}"/>
    </HierarchicalDataTemplate>
    <DataTemplate DataType="{x:Type column:Column}">
        <TextBlock Text="{Binding Path=Name}"/>
    </DataTemplate>
</Window.Resources>

我有以下TreeView

<TreeView Margin="5" Name="ProjectTreeView">
</TreeView>

加载项目时,我将ProjectTreeView的DataContext设置为项目对象 . 但是我在UI上看不到任何内容 . 当我改为

<TreeView Margin="5" Name="ProjectTreeView" ItemsSource="{Binding Path=InputDefinitions}">
</TreeView>

我能够将输入定义和列视为其子项 .

那么我怎样才能使它成为project => input definitions => columns