C# WPF:TreeView不显示任何子级
我一直在尝试让我的第一个C# WPF:TreeView不显示任何子级,c#,wpf,xaml,treeview,C#,Wpf,Xaml,Treeview,我一直在尝试让我的第一个TreeView工作,起初没有ViewModel。但无论我做什么,它都不会显示任何子项,即使绑定是正确的 我使用了两个Item模板,一个用于层次结构,另一个用于数据。您可以看到以下两个方面的重要部分: class GrupoTag { public string Nome { get; set; } public GrupoTag Pai { get; set; } public List<Tag> ListaFilhos { get;
TreeView
工作,起初没有ViewModel。但无论我做什么,它都不会显示任何子项,即使绑定是正确的
我使用了两个Item
模板,一个用于层次结构,另一个用于数据。您可以看到以下两个方面的重要部分:
class GrupoTag
{
public string Nome { get; set; }
public GrupoTag Pai { get; set; }
public List<Tag> ListaFilhos { get; set; }
public List<GrupoTag> SubGrupos { get; set; }
public GrupoTag(string nome)
{
Nome = nome;
ListaFilhos = new List<Tag>();
SubGrupos = new List<GrupoTag>();
}
public List<object> Filhos
{
get
{
List<object> lista = new List<object>();
foreach (GrupoTag subGrupo in SubGrupos)
lista.Add(subGrupo);
foreach (Tag filho in ListaFilhos)
lista.Add(filho);
}
}
}
XAML绑定到所有这些:
<TreeView Name="MenuTags">
<TreeView.Resources>
<HierarchicalDataTemplate DataType="xml2Excel2:GrupoTag" ItemsSource="{Binding Filhos}">
<TextBlock Text="{Binding Nome}" />
</HierarchicalDataTemplate>
<DataTemplate DataType="xml2Excel2:Tag">
<TextBlock Text="{Binding Nome}" />
</DataTemplate>
</TreeView.Resources>
</TreeView>
我已经阅读了所有相关的问题,并更正了相应错误的代码,但我仍然迷失在这里
编辑1:因此我修改了类的代码以符合下面的简单界面:
class ITag
{
public string Nome { get; set; }
public ObservableCollection<ITag> Filhos { get; set; }
}
它工作正常,
TreeView
功能正常。但我不知道为什么。您需要提供TreeView项目源和数据类型。我也同意贝林斯的意见,你们应该避免为每一个进入费霍斯房产的人列出新的名单。TreeView对多态性非常有效,我的意思是对数据类型
<TreeView DockPanel.Dock="Top"
DataContext="{Binding ProjectNodes_DataContext}"
ItemsSource="{Binding Nodes}">
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type local:ProjectNode}" ItemsSource="{Binding SubItems}">
<StackPanel>
<TextBlock Text="{Binding Header}"/>
</StackPanel>
</HierarchicalDataTemplate>
</TreeView.Resources>
类ProjectNodesVM具有:
public ObservableCollection<ProjectNode> Nodes {
get { return mNodes; }
protected set { SetProperty(ref mNodes, value); }
}
您需要提供TreeView项目源和数据类型。我也同意贝林斯的意见,你们应该避免为每一个进入费霍斯房产的人列出新的名单。TreeView对多态性非常有效,我的意思是对数据类型
<TreeView DockPanel.Dock="Top"
DataContext="{Binding ProjectNodes_DataContext}"
ItemsSource="{Binding Nodes}">
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type local:ProjectNode}" ItemsSource="{Binding SubItems}">
<StackPanel>
<TextBlock Text="{Binding Header}"/>
</StackPanel>
</HierarchicalDataTemplate>
</TreeView.Resources>
类ProjectNodesVM具有:
public ObservableCollection<ProjectNode> Nodes {
get { return mNodes; }
protected set { SetProperty(ref mNodes, value); }
}
我找到了我的具体案例的简单答案,而不是你的 孩子们必须是“财产” 因此:
public observeCollection ListaFilhos//不起作用
public observeCollection ListaFilhos{get;set;}//works
我找到了一个关于我的具体案例的简单答案,但似乎不是你的
孩子们必须是“财产”
因此:
public observeCollection ListaFilhos//不起作用
public observeCollection ListaFilhos{get;set;}//works
您需要使用ObservableCollection
,以便在视图中反映对项目的更新。另外,您需要一个简单的属性,并在属性getter之外的适当区域执行任何操作。这里的内容是在每次访问Filhos
属性时生成一个新列表。这是一个绑定噩梦。我尝试将绑定从Filhos
切换到SubGrupos
(一些节点具有此类型的子节点),并将所有属性的类型更改为observetecollection
,但它仍然没有做任何事情。无论我将绑定指向何处,它都没有显示任何内容。直接指向一个集合或另一个集合,即使它们是ObservableCollection
,也不起任何作用。您需要使用ObservableCollection
,以便在视图中反映对项目的更新。另外,您需要一个简单的属性,并在属性getter之外的适当区域执行任何操作。这里的内容是在每次访问Filhos
属性时生成一个新列表。这是一个绑定噩梦。我尝试将绑定从Filhos
切换到SubGrupos
(一些节点具有此类型的子节点),并将所有属性的类型更改为observetecollection
,但它仍然没有做任何事情。无论我将绑定指向何处,它都没有显示任何内容。直接指向一个集合或另一个集合,即使它们是可观察的集合
,也没有任何作用。给树视图
一个项源
或数据类型
是什么意思?我已经将这些属性赋予了HierarchycalDataTemplate
。这不是他们应该去的地方吗?我真的很困惑,对不起。@manoftheyear树需要根项目的项目资源。HierarchycalDataTemplate需要一个用于子项的模板。两者都不需要数据类型。已尝试删除数据类型
s并创建一个接口,但它使用了修改后的XAML。我只是不知道为什么。我将编辑该问题。@EdPlunkett您需要数据类型。TreeView与数据类型一起工作,ListView与ItemSources一起工作。@AdnanPoljak这根本没有意义。该上下文中的数据类型不起任何作用。在任何情况下,它都与ItemsSource无关。您给树视图一个ItemSource
或数据类型
是什么意思?我已经将这些属性赋予了HierarchycalDataTemplate
。这不是他们应该去的地方吗?我真的很困惑,对不起。@manoftheyear树需要根项目的项目资源。HierarchycalDataTemplate需要一个用于子项的模板。两者都不需要数据类型。已尝试删除数据类型
s并创建一个接口,但它使用了修改后的XAML。我只是不知道为什么。我将编辑该问题。@EdPlunkett您需要数据类型。TreeView与数据类型一起工作,ListView与ItemSources一起工作。@AdnanPoljak这根本没有意义。该上下文中的数据类型不起任何作用。在任何情况下,它都与ItemsSource无关。
private ProjectNodesVM mProjectNodes_DataContext;
public ProjectNodesVM ProjectNodes_DataContext
{
get { return mProjectNodes_DataContext; }
protected set
{
SetProperty(ref mProjectNodes_DataContext, value);
}
}
public ObservableCollection<ProjectNode> Nodes {
get { return mNodes; }
protected set { SetProperty(ref mNodes, value); }
}
private string mHeader;
public string Header
{
get { return mHeader; }
set { SetProperty(ref mHeader, value); }
}
public ObservableCollection<Tag> ListaFilhos ; //doesn't work
public ObservableCollection<Tag> ListaFilhos {get; set;} //works