[Silverlight / C#] TreeView mit verschiedenen Kindklassen

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Tejio
Establishment
Beiträge: 107
Registriert: 11.11.2010, 11:33

[Silverlight / C#] TreeView mit verschiedenen Kindklassen

Beitrag von Tejio »

Hallo, alle zusammen ;)

Ich habe folgende Struktur:

public class Root
{
public List<Child1> Children;
}

public class Child1
{
public List<Child2> Children2;
public string Name { get; }
}

public class Child2
{
public List<Child3> Children3;
public int Average { get; }
}

public class Child3
{
public int Count { get; }
public int Number { get; }
}

So, meine Aufgabe ist es jetzt, diese Datenstruktur in einem Silverlight-Usercontrol darzustellen. Ursprünglich wollte ich TreeView aus dem Silverlight-Toolkit verwenden, bloß habe ich bisher keine Beispiele für die Verwendung von verschiedenen Klassen in einem TreeView gefunden. Kennt ihr vielleicht einige Seiten, die sowas sehr gut rüber bringen? Bei meiner Suche habe ich nur Beispiele gefunden, die eine Klasse durchgehend verwenden. Meistens benannt als TreeNode.

Ich hoffe, ihr könnt mir weiterhelfen. Ich hab jedenfalls nicht ordentliches gefunden :oops:

Gruß, Tejio
Benutzeravatar
dowhilefor
Moderator
Beiträge: 173
Registriert: 27.02.2009, 15:44
Alter Benutzername: 6SidedDice
Echter Name: Nico Probst
Wohnort: Bochum
Kontaktdaten:

Re: [Silverlight / C#] TreeView mit verschiedenen Kindklasse

Beitrag von dowhilefor »

Endlich mal ne Frage wo ich vielleicht helfen kann :)

Also die einfachste und schnellste lösung ist es, für jeden deiner Klassentypen ein Template anzulegen. Allerdings statt DataTemplate, ein sogenanntes HierarchicalDataTemplate.
Diesem Template kann man zusätzlich wieder eine ItemsSource geben.

Nehmen wir mal an wir hätten diese 3 Unterschiedlichen Klassen.

Code: Alles auswählen

    class Drive
    {
        public Drive()
        {
            Folders = new ObservableCollection<Folder>();
        }
        public string DriveName { get; set; }
        public ObservableCollection<Folder> Folders { get; set; }
    }

    class Folder
    {
        public Folder()
        {
            Files = new ObservableCollection<File>();
        }
        public string FolderName { get; set; }
        public ObservableCollection<File> Files { get; set; }
    }

    class File
    {
        public string FileName { get; set; }
    }
Und erzeugen tun wir das ganze so:

Code: Alles auswählen

  
List<Drive> drives = new List<Drive>();
            drives.Add(new Drive() {DriveName = "C:\\"});
            drives.Add(new Drive() {DriveName = "D:\\"});
            drives.Add(new Drive() {DriveName = "E:\\"});

            drives[0].Folders.Add(new Folder() {FolderName = "Windows"});
            drives[0].Folders[0].Files.Add(new File() { FileName = "Test.txt" });

DataContext = drives;
erstellen unsere Treeview

Code: Alles auswählen

        <TreeView>
            <TreeViewItem Header="System" ItemsSource="{Binding}"/>
        </TreeView>
dann brauchen wir nur noch folgende HierarchicalDataTemplates zu definieren.

Code: Alles auswählen

<!-- Drives -->
        <HierarchicalDataTemplate DataType="{x:Type local:Drive}" ItemsSource="{Binding Folders}">
            <TextBlock Text="{Binding DriveName}"/>
        </HierarchicalDataTemplate>

        <!-- Folder -->
        <HierarchicalDataTemplate DataType="{x:Type local:Folder}" ItemsSource="{Binding Files}">
            <TextBlock Text="{Binding FolderName}"/>
        </HierarchicalDataTemplate>

        <!-- File -->
        <DataTemplate DataType="{x:Type local:File}">
            <TextBlock Text="{Binding FileName}"/>
        </DataTemplate>
Und können damit das aussehen direkt für jede der Klassen einzeln festlegen.

Hoffe das hilft dir etwas weiter :)
Mein Gehirn besteht nur noch aus einem hash-index, ich weiss was ich kenn aber kenn nicht was ich weiss
Antworten