我一直试图让我的第一个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>
是有效的。但我不知道为什么。
答案 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