2016-06-26 9 views
0

Gegeben folgende Modellwpf TreeView Datatemplate - ersetzen Element mit Baum

class Storage 
{ 
    public List<Stored> StoredItems { get; } 
} 

class Stored 
{ 
    public string Name { get; set; } 
    public List<File> Files { get; } = new List<File>(); 
} 

class File 
{ 
    public string Name { get; set; } 
    public Tree Schema { get; set; } 
} 

class Tree 
{ 
    public string Label { get; set; } 
    public List<Tree> Children { get; set; } = new List<Tree>(); 
} 

I Storage in TreeView anzeigen möchten, wie folgt:

StoredItem1.Name 
    File1.Schema.Label 
    File1.Schema.Children[0].Label 
    File1.Schema.Children[1].Label 
     File1.Schema.Children[1].Children.Label 
    File2.Schema.Label 
StoredItem2.Name 

dh zeigen alle Stored s, die Schema jedes enthalten würde Datei, die rekursiv ist.

Ich bin nicht sicher, wie es zu erreichen, ist mein Hauptproblem, wie die Schema angezeigt werden zu bekommen. Als ich mein Modell geändert Schema in einer Singleton Liste zu wickeln, es begann mein Modell zu arbeiten, aber ich möchte vermeiden, mit so etwas verschmutzen, auch noch, ich will nicht Dateinamen angezeigt werden und anstelle von Datei sein Schema anzuzeigen.

Eine andere Sache, die ich gerne eine Eigenschaft haben würde SelectedStoredItem in meiner Ansicht Modell und binden Sie es, nun, ausgewählt Stored Artikel. Es kann null sein, wenn zum Beispiel einige Schemaknoten ausgewählt wird, oder auf die Stored gleich sein, die ausgewählten Knoten gehört, aber ich ziehe es erste Option.

Hier ist meine XAML, es nicht tun, was ich will, zeigt nur Stored Elemente und deren Dateinamen.

<Window x:Class="TreeViewTest.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:local="clr-namespace:TreeViewTest" 
     mc:Ignorable="d" 
     Title="MainWindow" Height="350" Width="525"> 
    <Window.DataContext> 
     <local:Storage/> 
    </Window.DataContext> 
    <Grid> 
     <TreeView 
       ItemsSource="{Binding StoredItems}"> 
      <TreeView.Resources> 
       <HierarchicalDataTemplate DataType="{x:Type local:Stored}" 
              ItemsSource="{Binding Files}"> 
        <TextBlock Text="{Binding Name}"/> 
       </HierarchicalDataTemplate> 
       <HierarchicalDataTemplate DataType="{x:Type local:File}" 
              ItemsSource="{Binding Schema}"> 
        <TextBlock Text="{Binding Name}"/> 
       </HierarchicalDataTemplate> 
       <HierarchicalDataTemplate DataType="{x:Type local:Tree}" 
              ItemsSource="{Binding Children}"> 
        <TextBlock Text="{Binding Label}"/> 
       </HierarchicalDataTemplate> 
      </TreeView.Resources> 
     </TreeView> 
    </Grid> 
</Window> 

und hier ist vollständigen Code hinter

namespace TreeViewTest 
{ 
    public partial class MainWindow 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
     } 
    } 

    class Storage 
    { 
     public Storage() 
     { 
      StoredItems = new List<Stored>(); 
      var a1 = new Stored {Name = "Stored1"}; 
      a1.Files.Add(new File 
      { 
       Name = "File1", 
       Schema = new Tree 
       { 
        Label = "1_1", 
        Children = new List<Tree> { new Tree { Label = "1_1_1" } } 
       } 
      }); 
      a1.Files.Add(new File 
      { 
       Name = "File2", 
       Schema = new Tree 
       { 
        Label = "2_1", 
        Children = new List<Tree> { new Tree { Label = "2_1_1" }, new Tree { Label = "2_1_2" } } 
       } 
      }); 

      var a2 = new Stored { Name = "Stored2" }; 
      a2.Files.Add(new File 
      { 
       Name = "File1", 
       Schema = new Tree 
       { 
        Label = "1_1", 
        Children = new List<Tree> { new Tree { Label = "1_1_1" } } 
       } 
      }); 

      StoredItems.Add(a1); 
      StoredItems.Add(a2); 
     } 

     public List<Stored> StoredItems { get; } 
    } 

    class Stored 
    { 
     public string Name { get; set; } 
     public List<File> Files { get; } = new List<File>(); 
    } 

    class File 
    { 
     public string Name { get; set; } 
     public Tree Schema { get; set; } 
    } 

    class Tree 
    { 
     public string Label { get; set; } 
     public List<Tree> Children { get; set; } = new List<Tree>(); 
    } 
} 

Antwort

1

Ich will nicht Dateinamen angezeigt werden und anstelle von Datei sein Schema anzuzeigen

so Datenvorlage für Datei ändern

<HierarchicalDataTemplate DataType="{x:Type local:File}" 
          ItemsSource="{Binding Schema.Children}"> 
    <TextBlock Text="{Binding Schema.Label}"/> 
</HierarchicalDataTemplate> 

side note

Children = new List<Tree> { new Tree { Label = "2_1_1" }, new Tree { Label = "2_1_2" } } 

eine neue Liste innerhalb Objektinitialisierer schaffen, ist hier nicht notwendig. Es wurde bereits initialisiert (public List<Tree> Children { get; set; } = new List<Tree>();) und Sie können eine wie folgt schreiben:

Children = { new Tree { Label = "2_1_1" }, new Tree { Label = "2_1_2" } } 
+1

Verdammt, das war ziemlich einfach. die Initialisierung in Bezug auf, ich initialisiert Liste für jedes Objekt nur um sicher zu sein, dass ich nicht über eine Null bekommen, ich diese Art von Dingen in echtem Code nicht tun, nur um die Struktur setzen schnell wollte. Immer noch schön weiß auch, diese Syntax Zucker. Vielen Dank. –