WPF:TreeView不显示任何子项

时间:2017-03-29 18:42:01

标签: c# wpf xaml treeview

我一直试图让我的第一个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);
        }
    }
}
class Tag
    {
        public GrupoTag Pai { get; set; }
        public string Nome { get; set; }
        public Tag(string nome)
        {
            Nome = nome;
        }
        public Tag(GrupoTag pai, string nome)
        {
            Pai = pai;
            Nome = nome;
        }
    }

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>

但永远不会访问GrupoTag类上的属性“Filhos”。我已经尝试在那里放置一个断点,抛出异常,但它根本就没有被调用过。 TreeView仅在代码隐藏中显示我分配给GrupoTag的{​​{1}}集合的名称。

ItemSource

我已阅读所有相关问题并更正了相应错误的代码,但我仍然在这里丢失。

编辑1:所以我修改了类的代码以符合下面的简单接口:

MenuTags.ItemsSource = arvoreTeste.SubGrupos;

根据贝宁评论,GrupoTag现在使用存储在class ITag { public string Nome { get; set; } public ObservableCollection<ITag> Filhos { get; set; } } 中的单个属性来表示其子项。并且,根据Adnan的回答,我从XAML ObservableCollection中删除了DataType。现在它看起来像这样:

TreeView

它有效,<TreeView Name="ArvoreTags"> <TreeView.ItemTemplate> <HierarchicalDataTemplate ItemsSource="{Binding Children}"> <TextBlock Text="{Binding Nome}" /> </HierarchicalDataTemplate> </TreeView.ItemTemplate> </TreeView> 是有效的。但我不知道为什么。

2 个答案:

答案 0 :(得分:0)

您需要提供TreeView ItemSource和DataType。我同意Berins的评论,你应该避免为每次访问Filhos属性制作新的列表。 TreeView与Polymorphis非常合作,我的意思是数据类型。

<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>

我的财产是:

private ProjectNodesVM mProjectNodes_DataContext;
public ProjectNodesVM ProjectNodes_DataContext
{
    get { return mProjectNodes_DataContext; }
    protected set
    {
        SetProperty(ref mProjectNodes_DataContext, value);
    }
}

和类ProjectNodesVM有:

public ObservableCollection<ProjectNode> Nodes {
    get { return mNodes; }
    protected set { SetProperty(ref mNodes, value); }
}

在ProjectNode类中我有:

private string mHeader;
public string Header
{
    get { return mHeader; }
    set { SetProperty(ref mHeader, value); }
}

答案 1 :(得分:0)

我找到了针对我具体情况的简单答案,似乎不是你的

孩子必须是“财产”。

所以:

 public ObservableCollection<Tag> ListaFilhos ; //doesn't work
 public ObservableCollection<Tag> ListaFilhos {get; set;} //works