none
WPF Treeview Binding ObservableCollection RRS feed

  • Frage

  • Hallo für mich ist WPF noch neuland und ich habe folgendes vor:

    public class ProductCategory : BaseModel
        {
            [DataMember]
            public virtual string Name { get; set; }

            [DataMember]
            public virtual int? ParentCategoryId { get; set; }

            [DataMember]
            public virtual ProductCategory ParentCategory { get; set; }

            [DataMember]
            public virtual IList<ProductCategory> SubCatagories { get; set; }
            }
    }

    Ich habe eine Liste von Categories und SubCategories in einem

    public ObservableCollection<ProductCategory> Groups { get; set; }

    Jetzt komme ich einfach nicht drauf wie ich in WPF in ein TreeView meine Kategorien und Unterkategorien setze.

    Ich habe das Netz durchgesucht und komme einfach nicht auf die Lösung.

    Würde mich um Unterstützung sehr freuen.

    LG

    Johann1388

    Freitag, 21. Februar 2014 16:58

Antworten

  • Hallo,
    du musst im XAML nur ein ItemTemplate festlegen:

    <Window x:Class="WpfApplication83.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:local="clr-namespace:WpfApplication83"
            Title="MainWindow" Height="350" Width="525">
        <Grid>
            <TreeView ItemsSource="{Binding Groups}">
                <TreeView.ItemTemplate>
                    <HierarchicalDataTemplate DataType="local:ProductCategory" ItemsSource="{Binding SubCatagories}">
                        <TextBlock Text="{Binding Name}"/>
                    </HierarchicalDataTemplate>
                </TreeView.ItemTemplate>
            </TreeView>
        </Grid>
    </Window>

    DataType gibt an, für welche Art von Typ dieses Template verwendet werden soll. ItemsSource bestimmt die Liste mit Sub-Elementen.
    Im Codebehind habe ich die öffentliche Liste Groups und den DataContext zugewiesen:

    public MainWindow()
    {
        this.Groups = new ObservableCollection<ProductCategory>();//Liste zuweisen

    //Testitem erzeugen
        ObservableCollection<ProductCategory> sub1 = new ObservableCollection<ProductCategory>();
        sub1.Add(new ProductCategory() { Name = "Sub Item 1a" });
        sub1.Add(new ProductCategory() { Name = "Sub Item 1b" });
        this.Groups.Add(new ProductCategory() { Name = "Item 1", SubCatagories = sub1 });

        this.DataContext = this;

        InitializeComponent();
    }
    public ObservableCollection<ProductCategory> Groups { get; set; }//Öffentliche Liste.

    Unter Anpassen der Datenanzeige mit Datenbindung und WPF findest du noch weitere Informationen, auch zum TreeView. Ein komplexeres Template-Beispiel für die WPF Treeview findest du auf Codeplex.

    PS: Ich empfehle dir auch für die Sub-Kategorien eine ObservableCollection<T> zu verwenden. So kannst du die TreeView leichter aktualisieren.


    Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.


    Freitag, 21. Februar 2014 17:20
    Moderator

Alle Antworten

  • Also das Groups ist schon komplet befüllt.
    Freitag, 21. Februar 2014 16:59
  • Hallo,
    du musst im XAML nur ein ItemTemplate festlegen:

    <Window x:Class="WpfApplication83.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:local="clr-namespace:WpfApplication83"
            Title="MainWindow" Height="350" Width="525">
        <Grid>
            <TreeView ItemsSource="{Binding Groups}">
                <TreeView.ItemTemplate>
                    <HierarchicalDataTemplate DataType="local:ProductCategory" ItemsSource="{Binding SubCatagories}">
                        <TextBlock Text="{Binding Name}"/>
                    </HierarchicalDataTemplate>
                </TreeView.ItemTemplate>
            </TreeView>
        </Grid>
    </Window>

    DataType gibt an, für welche Art von Typ dieses Template verwendet werden soll. ItemsSource bestimmt die Liste mit Sub-Elementen.
    Im Codebehind habe ich die öffentliche Liste Groups und den DataContext zugewiesen:

    public MainWindow()
    {
        this.Groups = new ObservableCollection<ProductCategory>();//Liste zuweisen

    //Testitem erzeugen
        ObservableCollection<ProductCategory> sub1 = new ObservableCollection<ProductCategory>();
        sub1.Add(new ProductCategory() { Name = "Sub Item 1a" });
        sub1.Add(new ProductCategory() { Name = "Sub Item 1b" });
        this.Groups.Add(new ProductCategory() { Name = "Item 1", SubCatagories = sub1 });

        this.DataContext = this;

        InitializeComponent();
    }
    public ObservableCollection<ProductCategory> Groups { get; set; }//Öffentliche Liste.

    Unter Anpassen der Datenanzeige mit Datenbindung und WPF findest du noch weitere Informationen, auch zum TreeView. Ein komplexeres Template-Beispiel für die WPF Treeview findest du auf Codeplex.

    PS: Ich empfehle dir auch für die Sub-Kategorien eine ObservableCollection<T> zu verwenden. So kannst du die TreeView leichter aktualisieren.


    Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.


    Freitag, 21. Februar 2014 17:20
    Moderator