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>();
}
}
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. –