DataGrid für geschachtelte Collection

  • WPF

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von Schmittmuthelm.

    DataGrid für geschachtelte Collection

    Ich komme aktuell design-technisch nicht weiter, oder steh sehr auf dem Schlauch.

    Ich habe drei Klassen:

    C#-Quellcode

    1. public class Person
    2. {
    3. public int Alter { get; set; }
    4. public string Nachname { get; set; }
    5. public string Vorname { get; set; }
    6. }
    7. public class Ort
    8. {
    9. public ObservableCollection<Person> Einwohner { get; set; } = new ObservableCollection<Person>();
    10. public int PLZ { get; set; }
    11. }
    12. public class Landkreis
    13. {
    14. public ObservableCollection<Ort> Orte { get; set; } = new ObservableCollection<Ort>();
    15. }


    Im MainWindow habe ich das dummymäßig so gemacht:

    C#-Quellcode

    1. public partial class MainWindow : Window
    2. {
    3. public MainWindow()
    4. {
    5. InitializeComponent();
    6. DataContext = this;
    7. Loaded += (sender, e) =>
    8. {
    9. for (int i = 0; i < 3; i++)
    10. {
    11. MeinLandkreis.Orte.Add(new Ort { PLZ = 36124 + i });
    12. }
    13. MeinLandkreis.Orte[0].Einwohner.Add(new Person { Alter = 18, Vorname = "Max", Nachname = "Mustermann" });
    14. MeinLandkreis.Orte[0].Einwohner.Add(new Person { Alter = 43, Vorname = "Susi", Nachname = "Sorglos" });
    15. MeinLandkreis.Orte[0].Einwohner.Add(new Person { Alter = 21, Vorname = "Maria", Nachname = "Musterfrau" });
    16. MeinLandkreis.Orte[1].Einwohner.Add(new Person { Alter = 7, Vorname = "Peter", Nachname = "Schmidt" });
    17. MeinLandkreis.Orte[1].Einwohner.Add(new Person { Alter = 51, Vorname = "Albert", Nachname = "Einstein" });
    18. MeinLandkreis.Orte[1].Einwohner.Add(new Person { Alter = 30, Vorname = "Karl", Nachname = "Rudolf" });
    19. MeinLandkreis.Orte[2].Einwohner.Add(new Person { Alter = 72, Vorname = "Heinz", Nachname = "Abe" });
    20. MeinLandkreis.Orte[2].Einwohner.Add(new Person { Alter = 19, Vorname = "Ingo", Nachname = "Müller" });
    21. MeinLandkreis.Orte[2].Einwohner.Add(new Person { Alter = 54, Vorname = "Franz", Nachname = "Ferdinand" });
    22. };
    23. }
    24. public Landkreis MeinLandkreis { get; set; } = new Landkreis();
    25. }


    Am Ende soll das ganze nach Möglichkeit in etwa so aussehen wie im angehängten Bild.
    Hab versucht, das ganze in ein einziges DataGrid zu packen, nur bin ich zu blöd für die Einwohner einmalig die drei Spalten mit "Alter", "Vorname" und "Nachname" zu erstellen und dann enstpechend die Inhalte zuzuweisen.
    Ich häng die Projektmappe mal zum rumspielen mit an.
    Bilder
    • Data2.png

      50,76 kB, 1.490×1.018, 40 mal angesehen
    Dateien
    • DataGridTest.zip

      (19,33 kB, 48 mal heruntergeladen, zuletzt: )
    Dumm ist der, der dumm ist. Nicht andersrum!
    @Schmittmuthelm Hi ich meine es war nicht ganz trivial, geschachtelte Daten in einem DGV anzuzeigen. Nur falls Du es noch nicht in Betracht gezogen hast. Du könntest auch nur eine Klasse nehmen. Die Klasse Person. Diese um die Propertys Landkreis und Ort erweitern. Das Anzeigen wäre kein Problem mehr. Wenn Du nur einen Landkreis oder Ort etc. anzeigen möchtest, sortierst Du die Liste mit LINQ neu.
    codewars.com Rank: 4 kyu
    Ich sehe da den typischen Spagat zwischen OOP-DAten-Design und relationalem.
    Bei OOP tut man Objekte in Listen, die Properties sind von anderen Objekten, die auch wieder in Listen sind, welche Properties von noch anderen Objekten sind.
    (Einwohner->Ort->Landkreis)
    Bei relational verschachtelt man keine Listen, sondern jedes Objekt hat einen Verweis auf das übergeordnete Objekt, dem es angehört.

    Kannste hier zusätzlich einführen:
    Also Einwohner bekommt eine Ort-Property, und Ort bekommt eine Landkreis-Property.
    Wenn das gestrickt und richtig befüllt ist, ist die Anzeige im Datagrid, wo Personen, ihre Orte, und deren Landkreise anzuzeigen sind, wieder Sache ganz normalen Bindings.
    Hab das jetzt mal so umgebaut und das gefällt mir eigentlich ganz gut.
    In meiner richtigen Anwendung sind die Klassen allerdings etwas größer und einige sind aus Dlls. Muss ich mal sehen inwieweit ich das noch umbauen kann.
    Ihr habt mir erst mal geholfen, danke.
    Dumm ist der, der dumm ist. Nicht andersrum!