2012-08-28 3 views
2

J'essaie d'utiliser les fonctionnalités de liaison de données WPF pour obtenir un TreeView pour afficher une arborescence hiérarchique d'objets (catégories).Liaison de données à TreeView dans XAML

J'ai suivi à peu près this tutorial by Josh Smith, mais en vain: aucun élément n'apparaît dans mon TreeView.

Voici le code complet de mon application extrêmement simple:

using System.Windows; 

namespace WpfApplication1 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
      this.DataContext = CategoriesTreeViewModel.CreateDefault; 
     } 
    } 
} 

objets ViewModel et les données de l'échantillon:

using System.Collections.Generic; 
using System.Collections.ObjectModel; 
using System.Linq; 

namespace WpfApplication1 
{ 
    public class Category 
    { 
     public Category() 
     { 
      Children = new ObservableCollection<Category>(); 
     } 

     public ObservableCollection<Category> Children 
     { 
      get; 
      set; 
     } 
     public string Name { get; set; } 

    } 

    public class CategoriesTreeViewModel 
    { 
     public ReadOnlyCollection<Category> FirstGeneration; 

     private static IEnumerable<Category> SomeCategories 
     { 
      get 
      { 
       var A = new Category() { Name = "A" }; 
       var B = new Category() { Name = "B" }; 
       var A1 = new Category() { Name = "A1" }; 
       var A2 = new Category() { Name = "A2" }; 
       var B1 = new Category() { Name = "B1" }; 
       var B2 = new Category() { Name = "B2" }; 

       A.Children.Add(A1); 
       A.Children.Add(A2); 
       B.Children.Add(B1); 
       B.Children.Add(B2); 

       yield return A; 
       yield return B; 
      } 
     } 

     public static CategoriesTreeViewModel CreateDefault 
     { 
      get 
      { 
       var result = new CategoriesTreeViewModel() 
       { 
        FirstGeneration = new ReadOnlyCollection<Category>(SomeCategories.ToList()) 
       }; 
       return result;     
      } 
     } 
    } 
} 

Et XAML:

<Window x:Class="WpfApplication1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <TreeView ItemsSource="{Binding FirstGeneration}" Name="treeView1"> 
      <TreeView.ItemTemplate> 
       <HierarchicalDataTemplate ItemsSource="{Binding Children}"> 
        <TextBlock Text="{Binding Name}" /> 
       </HierarchicalDataTemplate> 
      </TreeView.ItemTemplate> 
     </TreeView> 
    </Grid> 
</Window> 

Pourquoi l'ébauche de contrôle TreeView?

+0

Avez-vous des erreurs de liaison dans votre fenêtre de sortie? Avez-vous essayé de vous lier à autre chose sur votre DataContext juste pour vérifier que la liaison fonctionne? – Thelonias

+0

@Ryan: 'System.Windows.Data Erreur: 40: Erreur de chemin BindingExpression: propriété 'FirstGeneration' introuvable sur 'object' '' CategoriesTreeViewModel '(HashCode = 62819840)'. BindingExpression: Path = FirstGeneration; ' –

Répondre

5

Vous n'avez aucun moyen d'accéder à votre propriété FirstGeneration. Une propriété sans accesseur "get" est considérée comme en écriture seule.

public ReadOnlyCollection<Category> FirstGeneration { get; set; } 
+0

Darn, vous avez raison. WPF autorise uniquement la liaison aux propriétés, pas aux champs (même s'ils sont publics). Merci –