C# 将多个TreeView显示为WPF中TreeView项列表的可观察集合

C# 将多个TreeView显示为WPF中TreeView项列表的可观察集合,c#,wpf,xaml,treeview,C#,Wpf,Xaml,Treeview,因为每个帖子我只能问一个问题,所以我会在这里再试一次 我尽量简单地解释我的问题。我想加载一个KML文件,并将其结构显示为树状视图。异步加载方法使用根节点和子节点填充整个树视图 如果我只加载1 KML文件,它就可以正常工作。但是我想加载多个KML文件,如果可能的话,将整个结构显示为TreeView列表 My View.xaml看起来像这样: <ListView ItemsSource="{Binding TreeViews}"> <Li

因为每个帖子我只能问一个问题,所以我会在这里再试一次

我尽量简单地解释我的问题。我想加载一个KML文件,并将其结构显示为树状视图。异步加载方法使用根节点和子节点填充整个树视图

如果我只加载1 KML文件,它就可以正常工作。但是我想加载多个KML文件,如果可能的话,将整个结构显示为TreeView列表

My View.xaml看起来像这样:

<ListView ItemsSource="{Binding TreeViews}">
            <ListView.ItemTemplate>
                <HierarchicalDataTemplate>
                    <TreeView Name="TreeView" MaxHeight="300" SelectedItemChanged="TreeView_SelectedItemChanged" ItemsSource="{Binding TreeViewItems}">
                        <TreeView.ItemContainerStyle>
                            <Style TargetType="{x:Type TreeViewItem}">
                                <Setter Property="IsExpanded" Value="True"/>
                            </Style>
                        </TreeView.ItemContainerStyle>
                        <TreeView.ItemTemplate>
                            <HierarchicalDataTemplate DataType="{x:Type local:TreeViewItem}" ItemsSource="{Binding ChildrenItems}">
                                <StackPanel Orientation="Horizontal">
                                    <CheckBox Focusable="False" IsChecked="{Binding IsChecked}"/>
                                    <ContentPresenter Margin="2,0,0,0" Content="{Binding NodeName, Mode=OneTime}"/>
                                </StackPanel>
                            </HierarchicalDataTemplate>
                        </TreeView.ItemTemplate>
                    </TreeView>
                </HierarchicalDataTemplate>
            </ListView.ItemTemplate>
</ListView>

在我的ViewModel中,我有两个属性:

public ObservableCollection<List<TreeViewItem>> TreeViews { get; set; }

private List<TreeViewItem> treeViewItems;
public List<TreeViewItem> TreeViewItems
{
    get { return treeViewItems; }
    set
    {
        treeViewItems = value;
        OnPropertyChanged();
    }
}
public observeCollection树视图{get;set;}
私有列表树项目;
公共列表树项
{
获取{return treeViewItems;}
设置
{
treeViewItems=值;
OnPropertyChanged();
}
}
出于测试目的,我刚刚在load方法中添加了几个项目:

List<TreeViewItem>  temp = new List<TreeViewItem>();

TreeViewItem rootItem = new TreeViewItem(null, null);
TreeViewItem ChildItem1 = new TreeViewItem(null, null);
TreeViewItem ChildItem2 = new TreeViewItem(null, null);

rootItem.ChildrenItems.Add(ChildItem1);
rootItem.ChildrenItems.Add(ChildItem2);

temp.Add(rootItem);

TreeViewItems = temp;

TreeViews.Add(TreeViewItems);
TreeViews.Add(TreeViewItems);
List temp=new List();
TreeViewItem rootItem=新的TreeViewItem(null,null);
TreeViewItem ChildItem1=新的TreeViewItem(null,null);
TreeViewItem ChildItem2=新的TreeViewItem(null,null);
rootItem.ChildrenItems.Add(ChildItem1);
rootItem.ChildrenItems.Add(ChildItem2);
临时添加(根项);
树项=温度;
添加(TreeViews);
添加(TreeViews);
现在,它应该在视图中显示两个相同的TreeView。但不幸的是,它只显示了两个带有复选框的空列表项


有谁能告诉我如何显示多个TreeView吗?

你的问题目前没有多大意义-为什么你认为需要TreeView中的TreeView来处理这种分层数据结构?什么是
local:TreeViewItem
,它与
System.Windows.Controls.TreeViewItem
有何不同

您最好将数据结构与可视化控件分离开来。类似于这样,在树视图中显示的每个级别的项目都有不同的类

public class KLMFile
{
    public string FileName {get; set;}
    ...
    public List<KLMItem> Children {get;} = new List<KLMItem>();
}

public class KLMItem
{
    public string Description {get;set;}
    ...
    public List<KLMSubItem> Children {get;} = new List<KLMSubItem>();  
}

public class KLMSubItem
{
    public string Description {get;set;}
    ...
    // top level items - no children
} 
<TreeView ItemsSource="{Binding KLMFileList}">
    <TreeView.Resources>
        <HierarchicalDataTemplate
            DataType="{x:Type local:KLMFile}"
            ItemsSource="{Binding Children}">
            <TextBlock Text="{Binding FileName}" />
        </HierarchicalDataTemplate>

        <HierarchicalDataTemplate
            DataType="{x:Type local:KLMItem}"
            ItemsSource="{Binding Children}">
            <TextBlock Text="{Binding Description}" />
        </HierarchicalDataTemplate>

        <DataTemplate
            DataType="{x:Type local:KLMSubItem}">
            <TextBlock Text="{Binding Description}" />
        </DataTemplate>
    </TreeView.Resources>
</TreeView>

my上关于WPF TreeView的更多详细信息(但更多地关注在MVVM设计模式中使用它们)。

您的问题目前没有多大意义-为什么您认为需要TreeView中的TreeView来处理这种分层数据结构?什么是
local:TreeViewItem
,它与
System.Windows.Controls.TreeViewItem
有何不同

您最好将数据结构与可视化控件分离开来。类似于这样,在树视图中显示的每个级别的项目都有不同的类

public class KLMFile
{
    public string FileName {get; set;}
    ...
    public List<KLMItem> Children {get;} = new List<KLMItem>();
}

public class KLMItem
{
    public string Description {get;set;}
    ...
    public List<KLMSubItem> Children {get;} = new List<KLMSubItem>();  
}

public class KLMSubItem
{
    public string Description {get;set;}
    ...
    // top level items - no children
} 
<TreeView ItemsSource="{Binding KLMFileList}">
    <TreeView.Resources>
        <HierarchicalDataTemplate
            DataType="{x:Type local:KLMFile}"
            ItemsSource="{Binding Children}">
            <TextBlock Text="{Binding FileName}" />
        </HierarchicalDataTemplate>

        <HierarchicalDataTemplate
            DataType="{x:Type local:KLMItem}"
            ItemsSource="{Binding Children}">
            <TextBlock Text="{Binding Description}" />
        </HierarchicalDataTemplate>

        <DataTemplate
            DataType="{x:Type local:KLMSubItem}">
            <TextBlock Text="{Binding Description}" />
        </DataTemplate>
    </TreeView.Resources>
</TreeView>

my.

列表视图
绑定到一个
可观察集合
,但您正试图绑定到
项目模板中
列表
的一个不存在的
TreeViews
属性:

<TreeView Name="TreeView" MaxHeight="300" ItemsSource="{Binding TreeViewItems}">

这行不通。您应该直接绑定到
列表



列表视图
已绑定到一个
可观察集合
,但您正试图绑定到您的
项目模板中
列表
属性的一个不存在的
树视图项

<TreeView Name="TreeView" MaxHeight="300" ItemsSource="{Binding TreeViewItems}">

这行不通。您应该直接绑定到
列表



您是否考虑过使用一个树状视图,将“文件项”放在顶层?除此之外,您不应该显式地创建TreeViewItem。而是创建数据项类的实例。TreeView将隐式创建TreeView项。感谢您的回复。是的,我也想过,但我认为这样做会更好。您所说的数据项类实例是什么意思?您是否考虑过使用一个树状视图,在顶层使用“文件项”?除此之外,您不应该显式地创建TreeViewItem。而是创建数据项类的实例。TreeView将隐式创建TreeView项。感谢您的回复。是的,我也想过,但我认为这样做会更好。你所说的数据项类实例是什么意思?@MarBot:你试过这个吗?您应该在视图中看到两个完全相同的TreeView,正如预期的那样。@MarBot:您尝试过这个吗?您应该在视图中看到两个完全相同的TreeView,如预期的那样。