2010-03-24 12 views
1

J'essaie de lier certaines données d'une instance de classe à un TreeView. Mon code est le suivant:Liaison à TreeView dans WPF

public partial class MainWindow : Window 
{   
    public MainWindow() 
    { 
     InitializeComponent(); 

     Parent myClass = new Parent(); 
     this.DataContext = myClass; 
    } 
} 

public class Parent 
{ 
    private List<string> children = new List<string>; 

    public string Name {get;set;} 
    public List<string> Children 
    { 
     get { return this.children; } 
     set { this.children=value; } 
    } 

    public Parent() 
    { 
     this.Name = "Test"; 

     for (int i = 1; i <= 10; i++) 
     { 
      Children.Add(i.ToString()); 
     } 
    } 
} 

Et le XAML:

<Window x:Class="WpfApplication1.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:loc="clr-namespace:WpfApplication1" 
    Title="MainWindow" Height="287" Width="525"> 

    <StackPanel Orientation="Horizontal" VerticalAlignment="Stretch"> 
     <TreeView Name="TreeView" ItemsSource="{Binding}"> 
      <TreeView.ItemTemplate> 
       <HierarchicalDataTemplate ItemsSource="{Binding Children}"> 
         <TextBlock Text="{Binding Name}"/> 
       </HierarchicalDataTemplate> 
      </TreeView.ItemTemplate> 
     </TreeView> 
    </StackPanel>  
</Window> 

Rien ne montre dans mon TreeView. Qu'est-ce que je fais mal?

Je me attends à:

-Tester
- 1
- 2
- 3
etc

mise à jour: faire Nom et propriétés enfants au lieu des champs publics .
mis à jour: ajouté ce que je m'attends à voir dans TreeView

Répondre

2

Vous liez "myClass" de type Parent au datacontext et utilisez le même objet pour ItemSource. Cela ne fonctionnera pas car Parent n'est pas un type énumérable.

Modifiez la liaison ItemSource de "{Binding}" à "{Binding Children}" et modifiez votre hierarchicalDataTemplate juste à un DataTemplate.

Si vous souhaitez conserver myClass en tant que nœud de niveau supérieur, vous pouvez également inclure myclass dans IEnumerable et définir cela comme contexte de données.

+0

Dans ce cas, comment est-ce que j'obtiendrais que Parent.Name apparaisse comme le nœud de niveau supérieur? C'est ce que je veux voir: -Tester --1 --2 --3 --4 etc – KrisTrip

+0

Créer une liste de type parent et ajoutez maclasse à lui. Ensuite, définissez le datacontext à la liste au lieu de l'objet. – apandit

0

Vous ne pouvez lier que des propriétés publiques, pas des champs. Remplacez Name et Children par des propriétés publiques et cela devrait fonctionner.

+0

Fait cette mise à jour (montré dans la question d'origine) et rien n'a changé. TreeView est toujours vide. – KrisTrip

0

essayer ici ceci:

<StackPanel Orientation="Horizontal" VerticalAlignment="Stretch"> 
     <TextBlock Text="{Binding Name}"/> 
     <TreeView Name="TreeView" ItemsSource="{Binding Children}"> 
      <TreeView.ItemTemplate> 
       <HierarchicalDataTemplate ItemsSource="{Binding Children}"> 
        <TextBlock Text="{Binding}"/> 
       </HierarchicalDataTemplate> 
      </TreeView.ItemTemplate> 
     </TreeView> 
    </StackPanel> 

Quelques choses:

  • Le 'Name' la propriété était hors de portée.
  • Nous devons lier la TreeView ainsi que la DataTemplate
  • Nous utilisons la valeur par défaut {Binding} pour appeler ToString() sur l'élément en cours.