2009-12-06 7 views
3

J'essaie de remplir une arborescence en utilisant mvvm mais l'arborescence n'affiche aucune donnée. J'ai une liste d'employés qui est une propriété dans mon vm qui contient des données d'employé. le xaml est comme suit.wpf treeview mvvm

   <Style TargetType="{x:Type TreeViewItem}"> 
        <Setter Property="FontWeight" Value="Normal" /> 

       </Style> 
      </TreeView.ItemContainerStyle> 

      <TreeView.ItemTemplate> 

       <HierarchicalDataTemplate ItemsSource="{Binding EmpList}" > 
        <TextBlock Text="{Binding EmpName}"/> 

       </HierarchicalDataTemplate> 

      </TreeView.ItemTemplate> 

     </TreeView> 

Y at-il quelque chose que je suis absent ici.

grâce

Répondre

7

Bonjour article suggéré par Ian est une excellente lecture!

L'astuce consiste à spécifier comment l'arborescence affiche ses éléments via des modèles de données (hiérarchiques) spécifiques au type. Vous spécifiez ces modèles de données dans les ressources de Treeview (ou plus haut dans l'arborescence visuelle si vous souhaitez les réutiliser dans plusieurs arborescences).

J'ai essayé de simuler ce que vous voulez:

<Window x:Class="TreeViewSelection.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:TreeViewSelection" 
    Title="Window1" Height="300" Width="300"> 
    <StackPanel> 
     <TreeView ItemsSource="{Binding Enterprises}"> 
      <TreeView.Resources> 
       <!-- template for showing the Enterprise's properties 
        the ItemsSource specifies what the next nested level's 
        datasource is --> 
       <HierarchicalDataTemplate DataType="{x:Type local:Enterprise}" 
              ItemsSource="{Binding EmpList}"> 
        <Label Content="{Binding EntName}"/> 
       </HierarchicalDataTemplate> 
       <!-- the template for showing the Employee's properties--> 
       <DataTemplate DataType="{x:Type local:Employee}"> 
        <Label Content="{Binding EmpName}"/> 
       </DataTemplate> 
      </TreeView.Resources> 
     </TreeView> 
    </StackPanel> 
</Window> 


    using System.Collections.ObjectModel; 
using System.Windows; 

namespace TreeViewSelection 
{ 
    public partial class Window1 : Window 
    { 
     public ObservableCollection<Enterprise> Enterprises { get; set; } 
     public Window1() 
     { 
      InitializeComponent(); 
      Enterprises = new ObservableCollection<Enterprise> 
          { 
           new Enterprise("Sweets4Free"), 
           new Enterprise("Tires4Ever") 
          }; 
      DataContext = this; 
     } 
    } 

    public class Enterprise : DependencyObject 
    { 
     public string EntName { get; set; } 
     public ObservableCollection<Employee> EmpList { get; set; } 

     public Enterprise(string name) 
     { 
      EntName = name; 
      EmpList = new ObservableCollection<Employee> 
         { 
          new Employee("John Doe"), 
          new Employee("Sylvia Smith") 
         }; 
     } 
    } 
     public class Employee : DependencyObject 
     { 
      public string EmpName { get; set; } 
      public Employee(string name) 
      { 
       EmpName = name; 
      } 
     } 
    } 
+0

+1 pour le mettre en contexte pour l'OP :) – kiwipom

5

Découvrez Josh Smith article exactement ce sujet ... m'a aidé pas de fin!

p.s. Il semble que vous manquiez la propriété DataType sur le HierarchicalDataTemplate, par exemple.

<HierarchicalDataTemplate 
    DataType="{x:Type local:ItemType}" 
    ItemsSource="{Binding ...}" > 
+0

grand article. Merci! – Dabblernl