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