2010-05-25 17 views
0

I ont les 2 catégories suivantes:problème avec Ayant TreeView et Multilist données hiérarchiques

public class DeviceGroup 
    { 
     public String Name { get; set; } 
     public ObservableCollection<DeviceGroup> DeviceGroups { get; set; } 
     public ObservableCollection<Device> Devices { get; set; } 


     public DeviceGroup() 
     { 
      Name = String.Empty; 
      DeviceGroups = new ObservableCollection<DeviceGroup>(); 
      Devices = new ObservableCollection<Device>(); 
     } 
    } 

    public class Device 
    { 
     public String Name { get; set; } 
    } 

Ma classe principale a une ObservableCollection.

Dans mon Xaml - je peux créer un TreeView facilement si je précise juste devicegroup dans mon HierachicalDataTemplate, comme suit:

<Window.Resources> 
    <ResourceDictionary> 
     <DataTemplate DataType="{x:Type local:Device}"> 
      <TextBlock Text="{Binding Name}"/> 
     </DataTemplate> 

     <HierarchicalDataTemplate DataType="{x:Type local:DeviceGroup}" ItemsSource="{Binding DeviceGroups}"> 
      <StackPanel> 
       <TextBlock Text="{Binding Name}"/> 
      </StackPanel> 
     </HierarchicalDataTemplate> 
    </ResourceDictionary> 
</Window.Resources> 
<Grid>   
    <TreeView ItemsSource="{Binding DeviceGroups}"/> 
</Grid> 

La question est: Comment puis-je sélectionner la collection Devices ainsi que la devicegroup? Je voudrais que les périphériques apparaissent quelque chose comme Windows Explorer (répertoires et fichiers). Y a-t-il une solution Xaml à ce problème? Ou devrais-je créer les TreeViewItems dans le codebehind. Merci.

Répondre

0

La seule solution que j'ai trouvé jusqu'à présent est dans le code sous-jacent:

private void LoadTree() 
    { 
     foreach (DeviceGroup dg in ttvm.DeviceGroups) 
     { 
      TreeViewItem tvi = new TreeViewItem(); 
      tvi.Header = dg; 
      treeView1.Items.Add(tvi); 
      AddTreeItems(tvi, dg); 
     } 
    } 

    private void AddTreeItems(TreeViewItem node, DeviceGroup deviceGroup) 
    { 
     foreach (DeviceGroup dg in deviceGroup.DeviceGroups) 
     { 
      TreeViewItem groupTVI = new TreeViewItem(); 
      groupTVI.Header = dg; 
      node.Items.Add(groupTVI); 
      AddTreeItems(groupTVI, dg); 
     } 

     foreach (Device device in deviceGroup.Devices) 
     { 
      TreeViewItem deviceTVI = new TreeViewItem(); 
      deviceTVI.Header = device; 
      node.Items.Add(deviceTVI); 
     } 
    } 

LoadTree() est appelée après InitilizeComponent. Le Xaml a changé à: ressources fenêtre:

 <HierarchicalDataTemplate DataType="{x:Type local:DeviceGroup}" ItemsSource="{Binding DeviceGroups}"> 
      <StackPanel> 
       <TextBlock Text="{Binding Name}"/> 
      </StackPanel> 
     </HierarchicalDataTemplate> 

avec juste une plaine TreeView dans une grille.