Jak stworzyć kolekcję wielopoziomową?

0
using System;
using System.Collections.Generic;
using System.Windows;
using System.Collections.ObjectModel;

namespace WpfTutorialSamples.TreeView_control
{
        public partial class TreeViewMultipleTemplatesSample : Window
        {
                public TreeViewMultipleTemplatesSample()
                {
                        InitializeComponent();

                        List<Family> families = new List<Family>();

                        Family family1 = new Family() { Name = "The Doe's" };
                        family1.Members.Add(new FamilyMember() { Name = "John Doe", Age = 42 });
                        family1.Members.Add(new FamilyMember() { Name = "Jane Doe", Age = 39 });
                        family1.Members.Add(new FamilyMember() { Name = "Sammy Doe", Age = 13 });
                        families.Add(family1);

                        Family family2 = new Family() { Name = "The Moe's" };
                        family2.Members.Add(new FamilyMember() { Name = "Mark Moe", Age = 31 });
                        family2.Members.Add(new FamilyMember() { Name = "Norma Moe", Age = 28 });
                        families.Add(family2);

                        trvFamilies.ItemsSource = families;
                }
        }

        public class Family
        {
                public Family()
                {
                        this.Members = new ObservableCollection<FamilyMember>();
                }

                public string Name { get; set; }

                public ObservableCollection<FamilyMember> Members { get; set; }
        }

        public class FamilyMember
        {
                public string Name { get; set; }

                public int Age { get; set; }
        }
}

Jak w temacie. Znalazłem taki przykład na stronce, ale ni jak nie wiem jak go ugryźć. tworzy się ładna "rodzina" ale powiedzmy że dzieci mają dzieci czyli trzeci poziom...jak to zrobić?

0

mozesz sobie dolozyc pole ktore jest kolekcja obiektow klasy zawierajacej, np tak:

        public class FamilyMember
        {
                public FamilyMember()
                {
                        this.Children= new ObservableCollection<FamilyMember>();
                }
 
                public string Name { get; set; }
                public int Age { get; set; }
 
                public ObservableCollection<FamilyMember> Children { get; set; }
        }
 
0

Całkiem inaczej. Tutaj nie masz nic o tym jakie są relacje pomiędzy członkami rodziny.
Dzieci moich dzieci (moje wnuki) to ciągle ta sama rodzina.
Klasy trzeba by przeprojektować np. tak, żeby jedna rodzina była tylko jednym ...poziomem drzewa genealogicznego i wskazywala na nastepny bądź poprzedni poziom. Albo na oba najlepiej, trochę na zasadzie LinkedList.

0

Nie są ważne relacje między członkami. W przykładzie mamy tak :
91713bc527.png
Niech teraz każdy z członków rodziny ma zwierze/syna/córkę nieważne. Ważne że trzeci poziom...jak zejść niżej?

0
List<FamilyMember> families = new List<FamilyMember>();

FamilyMember family1 = new FamilyMember() { Name = "The Doe's" };
family1.Children.Add(new FamilyMember() { Name = "John Doe", Age = 42 });
family1.Children.Add(new FamilyMember() { Name = "Jane Doe", Age = 39 });
family1.Children.Add(new FamilyMember() { Name = "Sammy Doe", Age = 13 });
families.Add(family1);

FamilyMember family2 = new FamilyMember() { Name = "The Moe's" };
family2.Children.Add(new FamilyMember() { Name = "Mark Moe", Age = 31 });
family2.Children.Add(new FamilyMember() { Name = "Norma Moe", Age = 28 });
families.Add(family2);
// i tu istotna czesc
FamilyMember level1 = new FamilyMember() { Name = "family with grandchildren" };
FamilyMember level2 = new FamilyMember() { Name = "family with children" };
FamilyMember level3 = new FamilyMember() { Name = "child" };
level2.Children.Add(level3);
level1.Children.Add(level2);
families.Add(level1);

trvFamilies.ItemsSource = families;
0
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Collections.ObjectModel;
using System.Data.Sql;
using System.Data.SqlClient;
using System.Data.SqlTypes;


namespace korektor_WPF.Pages
{
    public partial class ListaSrodkow : UserControl
    {
        public ListaSrodkow()
                {
                       
                        List<FamilyMember> families = new List<FamilyMember>();
                        FamilyMember family1 = new FamilyMember() { Name = "The Doe's" };
                        family1.Children.Add(new FamilyMember() { Name = "John Doe", Age = 42 });
                        family1.Children.Add(new FamilyMember() { Name = "Jane Doe", Age = 39 });
                        family1.Children.Add(new FamilyMember() { Name = "Sammy Doe", Age = 13 });
                        families.Add(family1);
                        FamilyMember family2 = new FamilyMember() { Name = "The Moe's" };
                        family2.Children.Add(new FamilyMember() { Name = "Mark Moe", Age = 31 });
                        family2.Children.Add(new FamilyMember() { Name = "Norma Moe", Age = 28 });
                        families.Add(family2);
                        // i tu istotna czesc
                        FamilyMember level1 = new FamilyMember() { Name = "family with grandchildren" };
                        FamilyMember level2 = new FamilyMember() { Name = "family with children" };
                        FamilyMember level3 = new FamilyMember() { Name = "child" };
                        level2.Children.Add(level3);
                        level1.Children.Add(level2);
                        families.Add(level1);
                        trvFamilies.ItemsSource = families;
                }
    }
    public class Family
    {
        public Family()
        {
            this.Members = new ObservableCollection<FamilyMember>();
        }

        public string Name { get; set; }

        public ObservableCollection<FamilyMember> Members { get; set; }
    }

    public class FamilyMember
    {
        public FamilyMember()
        {
            this.Children = new ObservableCollection<FamilyMember>();
        }
        public string Name { get; set; }
        public int Age { get; set; }

        public ObservableCollection<FamilyMember> Children { get; set; }
    }
}
<UserControl x:Class="korektor_WPF.Pages.ListaSrodkow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                xmlns:self="clr-namespace:korektor_WPF.Pages"
        xmlns:WindowTitle="ListaSrodkow" Height="1250" Width="1200">
    <Grid Margin="10">
        <TreeView Name="trvFamilies">
            <TreeView.Resources>
                <HierarchicalDataTemplate DataType="{x:Type self:Family}" ItemsSource="{Binding Members}">
                    <StackPanel Orientation="Horizontal">
                        <TextBlock Text="{Binding Name}" />
                        <TextBlock Text=" [" Foreground="Blue" />
                        <TextBlock Text="{Binding Members.Count}" Foreground="Blue" />
                        <TextBlock Text="]" Foreground="Blue" />
                    </StackPanel>
                </HierarchicalDataTemplate>
                <DataTemplate DataType="{x:Type self:FamilyMember}">
                    <StackPanel Orientation="Horizontal">
                        <TextBlock Text="{Binding Name}" />
                        <TextBlock Text=" (" Foreground="Green" />
                        <TextBlock Text="{Binding Age}" Foreground="Green" />
                        <TextBlock Text=" years)" Foreground="Green" />
                    </StackPanel>
                </DataTemplate>
            </TreeView.Resources>
        </TreeView>
    </Grid>
</UserControl>

Wszystko ładnie pięknie się kompiluje ale coś nie tak pokazuje.
25137d4378.png
Gdzie jest błąd??

0

tzn co nie tak pokazuje?

0

Nie rozwijają się poziomy, jest tylko pierwszy poziom i tyle nie ma pozostałych

0

a nie laska moze sprobowac cos zrozumiec z kodu ktory piszesz? w zyciu nie robilam nic w wpf no ale tak na logike, np.

<HierarchicalDataTemplate DataType="{x:Type self:Family}" ItemsSource="{Binding Members}">

powinno byc zmienione na

<HierarchicalDataTemplate DataType="{x:Type self:FamilyMember}" ItemsSource="{Binding Children}">

skoro bindujesz do modeli opartych o FamilyMember i Children...

0

Żeby to takie proste było, niestety to już sprawdzałem ale nie o to chodzi. Po zmianie wyrzuca błędem, ale dzięki za chęci może jakoś to ogarnę....

1 użytkowników online, w tym zalogowanych: 0, gości: 1