2010-03-23 7 views
2

Pourriez-vous me dire pourquoi je ne vois pas de sous-éléments?L'arbre WPF ne fonctionne pas

J'ai des applications WinForms et j'ai ajouté mon wpfusercontrol: ObjectsAndZonesTree

ServiceProvider est mon webservice. méthode Adn pour obtenir listofcountires avec des sous-éléments fonctionne correctement (je reçois Dess, les régions de ce Dess, provinces, etc ...)

ElementHost elementHost = new ElementHost 
              { 
               Width = 150, 
               Height = 50, 
               Dock = DockStyle.Fill, 
               Child = new ObjectsAndZonesTree() 
              }; 


      this.splitContainer3.Panel1.Controls.Add(elementHost); 

XAML:

<TreeView Name="GroupView" Grid.Row="0" Grid.Column="0" ItemsSource="{Binding}"> 
     <TreeView.Resources> 
      <HierarchicalDataTemplate DataType="{x:Type ServiceProvider:Country 
}" ItemsSource="{Binding Items}"> 
       <TextBlock Text="{Binding Path=Name}" /> 
       </HierarchicalDataTemplate> 
      <DataTemplate DataType="{x:Type ServiceProvider:Region}" > 
       <TextBlock Text="{Binding Path=Name}" /> 
       </DataTemplate> 
      <DataTemplate DataType="{x:Type ServiceProvider:Province}" > 
       <TextBlock Text="{Binding Path=Name}" /> 
       </DataTemplate> 
     </TreeView.Resources> 
    </TreeView> 

XAML.CS

public ObjectsAndZonesTree() 
     { 
      InitializeComponent(); 

      LoadView(); 
     } 

     private void LoadView() 
     { 
      GroupView.ItemsSource = new ServiceProvider().GetListOfObjectsAndZones(); 

     } 

class Pays:

public class Country 
    { 
     string _name; 

     [XmlAttribute] 
     public string Name 
     { 
      get { return _name; } 
      set { _name = value; } 
     } 
     string _code; 

     [XmlAttribute] 
     public string Code 
     { 
      get { return _code; } 
      set { _code = value; } 
     } 

     string _continentCode; 

     [XmlAttribute] 
     public string ContinentCode 
     { 
      get { return _continentCode; } 
      set { _continentCode = value; } 
     } 

     public Region[] ListOfRegions 
     { 
      get { return _listOfRegions; } 
      set { _listOfRegions = value; } 
     } 

     private Region[] _listOfRegions; 

     public IList<object> Items 
     { 
      get 
      { 
       IList<object> childNodes = new List<object>(); 
       foreach (var group in this.ListOfRegions) 
        childNodes.Add(group); 

       return childNodes; 
      } 
     } 



    } 

Classe Région:

public class Région {

private Province[] _listOfProvinces; 
     private string _name; 
     private string _code; 

     public Province[] ListOfProvinces 
     { 
      get { return _listOfProvinces; } 
      set { _listOfProvinces = value; } 
     } 

     public string Name 
     { 
      get { 
       return _name; 
      } 
      set { 
       _name = value; 
      } 
     } 

     public string Code 
     { 
      get { 
       return _code; 
      } 
      set { 
       _code = value; 
      } 
     } 

     public string CountryCode 
     { 
      get { return _countryCode; } 
      set { _countryCode = value; } 
     } 

     private string _countryCode; 

     public IList<object> Items 
     { 
      get 
      { 
       IList<object> childNodes = new List<object>(); 
       foreach (var group in this.ListOfProvinces) 
        childNodes.Add(group); 

       return childNodes; 
      } 
     } 
} 

Il me affiche seulement la liste des Dess.

+0

@Phenevo: Avez-vous encore des problèmes? – VoidDweller

Répondre

2

Votre RégionDataTemplate doit être HierarchicalDataTemplate pour prendre en charge les éléments imbriqués (sous-éléments). Vous devez également spécifier ItemsSource.

<TreeView Name="GroupView" Grid.Row="0" Grid.Column="0" ItemsSource="{Binding}"> 
    <TreeView.Resources> 
     <HierarchicalDataTemplate DataType="{x:Type ServiceProvider:Country}" 
            ItemsSource="{Binding Items}"> 
      <TextBlock Text="{Binding Path=Name}" /> 
     </HierarchicalDataTemplate> 
     <HierarchicalDataTemplate DataType="{x:Type ServiceProvider:Region}" 
            ItemsSource="{Binding Items}"> 
      <TextBlock Text="{Binding Path=Name}" /> 
     </HierarchicalDataTemplate> 
     <DataTemplate DataType="{x:Type ServiceProvider:Province}"> 
      <TextBlock Text="{Binding Path=Name}" /> 
     </DataTemplate> 
    </TreeView.Resources> 
</TreeView> 

Ainsi, par exemple si vous ajoutez Villes à vos Provinces les changements dans votre XAML pourrait ressembler à ceci.

 <HierarchicalDataTemplate DataType="{x:Type ServiceProvider:Province}" 
            ItemsSource="{Binding Cities}"> 
      <TextBlock Text="{Binding Path=Name}" /> 
     </HierarchicalDataTemplate> 

     <DataTemplate DataType="{x:Type ServiceProvider:City}"> 
      <TextBlock Text="{Binding Path=Name}" /> 
     </DataTemplate> 
0

Avez-vous implémenté INotifyPropertyChanged sur la classe de source de liaison?

Plus vous pouvez vérifier les exceptions de liaison dans la fenêtre de sortie de Visual Studio. Cela vous aidera à comprendre les liaisons invalides.

1

Je ne sais pas où votre problème, mais je pensais que je partagerais vous êtes la meilleure ressource que j'ai trouvée en traitant avec Treeview. Thoses méthodes d'extension m'a sauvé beaucoup de tracas:

http://www.scip.be/index.php?Page=ArticlesNET23

Ils transforment une liste plate dans un IEnumerable de HierarchyNode en utilisant une syntaxe lambda agréable. Il est implémenté avec IQueryable, ce qui signifie efficace même par rapport à un datacontex linq.

Questions connexes