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