Jak stworzyć kolekcję wielopoziomową?

Jak stworzyć kolekcję wielopoziomową?
M1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 37
0
Kopiuj
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ć?

katelx
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Hong Kong
0

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

Kopiuj
        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; }
        }
 
  • Rejestracja: dni
  • Ostatnio: dni
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.

M1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 37
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?

katelx
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Hong Kong
0
Kopiuj
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;
M1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 37
0
Kopiuj
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; }
    }
}
Kopiuj
<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??

katelx
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Hong Kong
0

tzn co nie tak pokazuje?

M1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 37
0

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

katelx
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Hong Kong
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.

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

powinno byc zmienione na

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

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

M1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 37
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ę....

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.