.net WPF TreeView-使用嵌套集合和;“静态节点”;

.net WPF TreeView-使用嵌套集合和;“静态节点”;,.net,wpf,data-binding,mvvm,treeview,.net,Wpf,Data Binding,Mvvm,Treeview,我已经研究了关于TreeView数据绑定到嵌套集合的类似问题,并且我已经阅读了几篇关于这个主题的“Josh'n Bea”文章,但我的设计不同之处在于,我有“静态”TreeView项,它们用作嵌套集合项的可折叠容器。最好能说明我在寻找什么 给定这些ViewModel类: 名称空间树视图示例 { 公共类应用程序视图模型 { 公共应用程序ViewModel(){Projects=new List();} 公共IEnumerable项目{get;set;} } 公共类ProjectViewModel {

我已经研究了关于TreeView数据绑定到嵌套集合的类似问题,并且我已经阅读了几篇关于这个主题的“Josh'n Bea”文章,但我的设计不同之处在于,我有“静态”TreeView项,它们用作嵌套集合项的可折叠容器。最好能说明我在寻找什么

给定这些ViewModel类:

名称空间树视图示例
{
公共类应用程序视图模型
{
公共应用程序ViewModel(){Projects=new List();}
公共IEnumerable项目{get;set;}
}
公共类ProjectViewModel
{
公共项目视图模型(){Maps=new List();}
公共字符串名称{get;set;}
公共IEnumerable映射{get;set;}
}
公共类MapViewModel
{
公共MapViewModel(){Tables=new List();}
公共字符串名称{get;set;}
公共IEnumerable表{get;set;}
}
公共类TableViewModel
{
public TableViewModel(){Fields=new List();}
公共字符串名称{get;set;}
公共IEnumerable字段{get;set;}
}
公共类FieldViewModel
{
公共字符串名称{get;set;}
}
}
这就是我想要的结果:

有人能帮我处理这个树视图的XAML吗?我原以为自己理解了HierarchycalDataTemplates的工作原理,但“静态”容器节点(“表”、“字段”、“映射”)似乎让我感到困惑


谢谢你,祝你有愉快的一天

我认为您还必须为“静态”节点创建
hierarchycaldatatemplate
s。由于
HierarchycalDataTemplate
的ItemsSource需要一个集合,所以您可以像这样在Xaml中创建这些集合

<!-- Field Templates -->
<HierarchicalDataTemplate x:Key="FieldsTemplate">
    <TextBlock Text="{Binding Name}"/>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate x:Key="FieldTemplate"
                          ItemTemplate="{StaticResource FieldsTemplate}"
                          ItemsSource="{Binding RelativeSource={RelativeSource AncestorType={x:Type TreeViewItem}},
                                                Path=DataContext.Fields}">
    <TextBlock Text="{Binding}"/>
</HierarchicalDataTemplate>

<!-- Table Templates -->
<HierarchicalDataTemplate x:Key="TablesTemplate"
                          ItemTemplate="{StaticResource FieldTemplate}"
                          ItemsSource="{Binding Source={StaticResource FieldCollection}}">
    <TextBlock Text="{Binding Name}"/>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate x:Key="TableTemplate"
                          ItemTemplate="{StaticResource TablesTemplate}"
                          ItemsSource="{Binding RelativeSource={RelativeSource AncestorType={x:Type TreeViewItem}},
                                                Path=DataContext.Tables}">
    <TextBlock Text="{Binding}"/>
</HierarchicalDataTemplate>

<!-- Map Templates -->
<HierarchicalDataTemplate x:Key="MapsTemplate"
                          ItemTemplate="{StaticResource TableTemplate}"
                          ItemsSource="{Binding Source={StaticResource TableCollection}}">
    <TextBlock Text="{Binding Name}"/>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate x:Key="MapTemplate"
                          ItemTemplate="{StaticResource MapsTemplate}"
                          ItemsSource="{Binding RelativeSource={RelativeSource AncestorType={x:Type TreeViewItem}},
                                                Path=DataContext.Maps}">
    <TextBlock Text="{Binding}"/>
</HierarchicalDataTemplate>

<!-- Project Template -->
<HierarchicalDataTemplate x:Key="ProjectDataTemplate"
                          ItemTemplate="{StaticResource MapTemplate}"
                          ItemsSource="{Binding Source={StaticResource MapCollection}}">
    <TextBlock Text="{Binding Path=Name}"/>
</HierarchicalDataTemplate>
名称空间

收藏

使用这种方法,
hierarchycaldatatemplate
s可以如下所示

<!-- Field Templates -->
<HierarchicalDataTemplate x:Key="FieldsTemplate">
    <TextBlock Text="{Binding Name}"/>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate x:Key="FieldTemplate"
                          ItemTemplate="{StaticResource FieldsTemplate}"
                          ItemsSource="{Binding RelativeSource={RelativeSource AncestorType={x:Type TreeViewItem}},
                                                Path=DataContext.Fields}">
    <TextBlock Text="{Binding}"/>
</HierarchicalDataTemplate>

<!-- Table Templates -->
<HierarchicalDataTemplate x:Key="TablesTemplate"
                          ItemTemplate="{StaticResource FieldTemplate}"
                          ItemsSource="{Binding Source={StaticResource FieldCollection}}">
    <TextBlock Text="{Binding Name}"/>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate x:Key="TableTemplate"
                          ItemTemplate="{StaticResource TablesTemplate}"
                          ItemsSource="{Binding RelativeSource={RelativeSource AncestorType={x:Type TreeViewItem}},
                                                Path=DataContext.Tables}">
    <TextBlock Text="{Binding}"/>
</HierarchicalDataTemplate>

<!-- Map Templates -->
<HierarchicalDataTemplate x:Key="MapsTemplate"
                          ItemTemplate="{StaticResource TableTemplate}"
                          ItemsSource="{Binding Source={StaticResource TableCollection}}">
    <TextBlock Text="{Binding Name}"/>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate x:Key="MapTemplate"
                          ItemTemplate="{StaticResource MapsTemplate}"
                          ItemsSource="{Binding RelativeSource={RelativeSource AncestorType={x:Type TreeViewItem}},
                                                Path=DataContext.Maps}">
    <TextBlock Text="{Binding}"/>
</HierarchicalDataTemplate>

<!-- Project Template -->
<HierarchicalDataTemplate x:Key="ProjectDataTemplate"
                          ItemTemplate="{StaticResource MapTemplate}"
                          ItemsSource="{Binding Source={StaticResource MapCollection}}">
    <TextBlock Text="{Binding Path=Name}"/>
</HierarchicalDataTemplate>

树景



非常感谢您的解决方案和内容丰富的解释!这很有效!如果我希望有另一种类型的并行解决方案,那么这个解决方案会是什么样子。比如说,在地图旁边,还有同一级别的区域。有没有比templateselector更简单的解决方案?
ItemsSource="{Binding RelativeSource={RelativeSource AncestorType={x:Type TreeViewItem}},
                      Path=DataContext.Maps}"
<!-- Field Templates -->
<HierarchicalDataTemplate x:Key="FieldsTemplate">
    <TextBlock Text="{Binding Name}"/>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate x:Key="FieldTemplate"
                          ItemTemplate="{StaticResource FieldsTemplate}"
                          ItemsSource="{Binding RelativeSource={RelativeSource AncestorType={x:Type TreeViewItem}},
                                                Path=DataContext.Fields}">
    <TextBlock Text="{Binding}"/>
</HierarchicalDataTemplate>

<!-- Table Templates -->
<HierarchicalDataTemplate x:Key="TablesTemplate"
                          ItemTemplate="{StaticResource FieldTemplate}"
                          ItemsSource="{Binding Source={StaticResource FieldCollection}}">
    <TextBlock Text="{Binding Name}"/>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate x:Key="TableTemplate"
                          ItemTemplate="{StaticResource TablesTemplate}"
                          ItemsSource="{Binding RelativeSource={RelativeSource AncestorType={x:Type TreeViewItem}},
                                                Path=DataContext.Tables}">
    <TextBlock Text="{Binding}"/>
</HierarchicalDataTemplate>

<!-- Map Templates -->
<HierarchicalDataTemplate x:Key="MapsTemplate"
                          ItemTemplate="{StaticResource TableTemplate}"
                          ItemsSource="{Binding Source={StaticResource TableCollection}}">
    <TextBlock Text="{Binding Name}"/>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate x:Key="MapTemplate"
                          ItemTemplate="{StaticResource MapsTemplate}"
                          ItemsSource="{Binding RelativeSource={RelativeSource AncestorType={x:Type TreeViewItem}},
                                                Path=DataContext.Maps}">
    <TextBlock Text="{Binding}"/>
</HierarchicalDataTemplate>

<!-- Project Template -->
<HierarchicalDataTemplate x:Key="ProjectDataTemplate"
                          ItemTemplate="{StaticResource MapTemplate}"
                          ItemsSource="{Binding Source={StaticResource MapCollection}}">
    <TextBlock Text="{Binding Path=Name}"/>
</HierarchicalDataTemplate>
<TreeView Name="treeView"
          ItemTemplate="{StaticResource ProjectDataTemplate}"
          ItemsSource="{Binding Projects}"/>