myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » GUI: WPF und XAML » Wie kann ich im ViewModel verschachtelte Klassen und Listen an meine View binden?
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

Wie kann ich im ViewModel verschachtelte Klassen und Listen an meine View binden?

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
GeneVorph GeneVorph ist männlich
myCSharp.de-Mitglied

Dabei seit: 09.02.2015
Beiträge: 118
Entwicklungsumgebung: Visual Studio 2013


GeneVorph ist offline

Wie kann ich im ViewModel verschachtelte Klassen und Listen an meine View binden?

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo,

Ich möchte ein Datagrid mit Daten befüllen (MVVM). In meinem ViewModel sieht das dann so aus:

XML-Code:
<DataGrid AutoGenerateColumns="False" ItemsSource="{Binding DummyStudents}">
                <DataGrid.Columns >
                    <DataGridTextColumn Header="Nachname" Binding="{Binding LastName}"></DataGridTextColumn>
                    <DataGridTextColumn Header="Vorname" Binding="{Binding PreName}"></DataGridTextColumn>
                    <DataGridTextColumn Header="Klasse" Binding="{Binding ClassLabel}"></DataGridTextColumn>
                    <DataGridTextColumn Header="Bildungsgang" Binding="{Binding EducationType}"></DataGridTextColumn>
                    <DataGridTextColumn Header="Mathematik" Binding="{Binding Subjects.GradeAverageValToStr}"></DataGridTextColumn>

                </DataGrid.Columns>
            </DataGrid>

Soweit funktioniert mein Code - ich bekomme die in 'DummyStudents (eine ObservableCollection<Student>) hinterlegten Objekte angezeigt. Bis auf die 5. Column, denn hier müsste ich auf das Property einer verschachtelten Klasse zugreifen. (public class Student--> List<Subject>Subjects--> hier bit es 10 Einträge, jeder sollte einer extra Column zugeordnet werden.)

Ein Student-Objekt schaut bei mir so aus:

C#-Code:
        public string PreName { get; set; }

        public string LastName { get; set; }

        public string ClassLabel { get; set; }

        public string EducationType { get; set; }

        public List<Subject> Subjects { get; set; } = new List<Subject>();

Interessant wird es bei List<Subject> Subjects. Der Typ Subject ist wiederum eine Klasse mit ein paar Properties und wiederum einer List<Grades> Grades (Schulnoten also) usw. Diese sind keine ObservableCollections, sondern eben Lists.

Bisher habe ich es immer so gemacht, dass ich sämtliche für die GUI relevanten Datenfelder in Form gesonderter ObservableCollections oder Properties in meinem ViewModel implementiert hatte.

Meine Frage: gibt es da noch einen anderen Weg? Denn

XML-Code:
Binding="{Binding Subjects.GradeAverageValToStr}"

funktioniert nicht - meine ItemsSource ist bereits eine ObservableCollection und 'Subjects' ist eine List<Subject>, die zum Typ 'Student' gehört.

Ich hoffe, ich konnte das Problem einigermaßen genau skizzieren: vereinfacht: was tun, bei verschachtelten Klassen (speziell Objekte, die wieder Listen anderer Objekte bereithalten)?

Gruß
Vorph
14.02.2020 15:58 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Th69
myCSharp.de-Poweruser/ Experte

avatar-2578.jpg


Dabei seit: 01.04.2008
Beiträge: 3.593
Entwicklungsumgebung: Visual Studio 2015/17


Th69 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Verstehe ich das richtig, das du je Eintrag in der Subjects-Liste eine neue DataGrid-Spalte erzeugen lassen möchtest?
Dann hast du ein Verständnisproblem (das hat nichts mit dem Typ zu tun), denn durch das Binding werden nicht automatisch neue Spalten erzeugt (sondern es wird nur für die aktuelle Spalte die angegebene Eigenschaft gebunden). Und da Subjects eine Liste ist, gibt es kein Subjects.GradeAverageValToStr, denn du würdest dazu ein konkretes Subject-Objekt benötigen, z.B. Subjects[0].GradeAverageValToStr.

Ich habe zum dynamischen Binden von DataGrid-Spalten folgenden Link gefunden:  How to Add Columns to a DataGrid through Binding and Map Its Cell Values (ist aber nicht ganz einfach)
14.02.2020 16:19 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
MrSparkle MrSparkle ist männlich
myCSharp.de-Team

avatar-2159.gif


Dabei seit: 16.05.2006
Beiträge: 5.383
Herkunft: Leipzig


MrSparkle ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat von GeneVorph:
10 Einträge, jeder sollte einer extra Column zugeordnet werden.

Was spricht dagegen, diese 10 Eigenschaften anstatt der Liste zum ViewModel hinzuzufügen?
14.02.2020 16:30 Beiträge des Benutzers | zu Buddylist hinzufügen
GeneVorph GeneVorph ist männlich
myCSharp.de-Mitglied

Dabei seit: 09.02.2015
Beiträge: 118
Entwicklungsumgebung: Visual Studio 2013

Themenstarter Thema begonnen von GeneVorph

GeneVorph ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hi, und vielen Dank für euere Antworeten!

@Mr.Sparkle

Zitat:
Was spricht dagegen, diese 10 Eigenschaften anstatt der Liste zum ViewModel hinzuzufügen?

Prinzipiell gar nichts - tatsächlich habe ich es jetzt erst einmal so gelöst. Ich nenne das jetzt mal eine "Mediator"-Klasse (kenne den Fachbegriff nicht); eine Klasse, die alle Verschachtelungen als einfache Properties bereitstellt.

@Th69 Nicht ganz ein Verständnisproblem; mir war ja schon klar, dass es so nicht funktioniert - es wäre aber durchaus denkbar gewesen, dass es da eine Art "Workaround" gibt. Übrigens: danke für den Link - dieser ist aber für meine Mini-App "way over the top" :)

Einstweilen vielen Dank.
Gruß
Vorph
15.02.2020 11:51 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 3 Monate.
Der letzte Beitrag ist älter als 3 Monate.
Antwort erstellen


© Copyright 2003-2020 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 04.06.2020 22:32