Laden...

Wie kann ich einen hidden value an ListBox Item anhängen ähnlich der id als "hidden" im HTML?

Erstellt von PierreDole vor 3 Jahren Letzter Beitrag vor 3 Jahren 1.192 Views
P
PierreDole Themenstarter:in
74 Beiträge seit 2017
vor 3 Jahren
Wie kann ich einen hidden value an ListBox Item anhängen ähnlich der id als "hidden" im HTML?

Moin,
kann man irgendwie eine Art Hidden Value an die ListBox Elemente anhängen, wo ich eine ID hinterlegen kann, ähnlich wie im HTML <input name="xyz" value="test" hidden="1234">?

Ich fülle die Liste mit Personen aus einer Datenbank. Die Liste zeigt mir Vorname und Nachname an. Nun gibt es zwei Hans Müller. Will jetzt wissen, welchen von beiden ich auswähle. Am besten wäre es, wenn ich die ID aus der DB an jedes Element übergeben könnte.

Geht das irgendwie?

2.079 Beiträge seit 2012
vor 3 Jahren

Geht das irgendwie?

Diese Frage kann man prinzipiell mit "Ja" beantworten.
Und ein "Hidden Item" ist auch kein Thema, mach eben die Höhe per Style auf 0.

Aber was Du schreibst, klingt, als würdest Du alle drei Schichten ( [Artikel] Drei-Schichten-Architektur ) durcheinander werfen?
Außerdem solltest Du bei WPF nach MVVM ( [Artikel] MVVM und DataBinding ) arbeiten, das ermöglicht dir, eine sehr einfache Trennung zwischen UI und einer ViewModel-Klasse, wo Du dann dann und lassen kannst, was Du willst.

Ich würde für die Person neben dem Model noch ein ViewModel mit allen Anzeige-Daten anlegen und dann die ViewModels an die ListBox übergeben. Das ViewModel kann dann auch zusätzlich eine Property wie "IsSelected" haben, über die Du dir dann merken kannst, welcher Eintrag ausgewählt wurde.

Aber vergiss nicht: Auch in dem ViewModel hat keine Datenbank-Operation etwas verloren.

NuGet Packages im Code auslesen
lock Alternative für async/await

Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.

5.658 Beiträge seit 2006
vor 3 Jahren

In [Artikel] MVVM und DataBinding gibt es auch Beispiel-Code und ein Beispiel-Projekt dazu.

Weeks of programming can save you hours of planning

P
PierreDole Themenstarter:in
74 Beiträge seit 2017
vor 3 Jahren

Drei-Schichten-Architektur: Schreibe gerade alles drauf um.

MVVM: Ist drin. Für Listen nutze ich es aber nicht, da ich die Listen nicht über MVVM zum Laufen bekomme. Im Artikel der Punk 2.4, wie befülle ich da die Liste? Muss ich für jeden Listeneintrag ein Objekt von EmployeeViewModel instanziieren? Diesen Datentyp erwartet nämlich viewModel.Employees.Add.

4.939 Beiträge seit 2008
vor 3 Jahren

Du mußt nicht zwangsläufig ein ViewModel bei der ObservableCollection<T> benutzen, das kann ein beliebiger Datentyp sein (also z.B. eine eigene Klasse mit verschiedenen Eigenschaften, wo du dann eine [oder mehrere] der Eigenschaften bei der ListBox per Binding für die Anzeige angibst und alle anderen sind quasi "hidden").

2.079 Beiträge seit 2012
vor 3 Jahren

Du mußt nicht zwangsläufig ein ViewModel bei der ObservableCollection<T> benutzen, das kann ein beliebiger Datentyp sein

Das ist doch ein ViewModel? 😄

Muss ich für jeden Listeneintrag ein Objekt von EmployeeViewModel instanziieren?

Ich sehe da kein Problem, pro Eintrag ein ViewModel zu erzeugen. Gut, sind ein paar Objekte mehr, aber solange das kein Performance-Problem ist, würde ich nicht weiter darüber nachdenken.
Außerdem hast Du später den Vorteil, dass Du das ViewModel-Objekt mit anderen View-Daten behalten und nur das Model austauschen kannst (PropertyChanged nicht vergessen), das erspart 1. aufwändiges Neu-Aufbauen der Controls pro Item (ich hatte deshalb schon mehrere Minuten Ladezeit, die ich reduzieren musste) und 2. hast Du so eine billig Art "Speicherstand", der auch nach dem Neuladen nicht verloren geht.

Alternativ kannst Du aber auch nur die Models rein stecken und neben die Liste eine "SelectedItem"-Property anlegen. Die kannst Du dann binden und weißt, welches Item gerade ausgewählt ist.
Und die "hidden" Items fügst Du einfach nicht der Liste hinzu.

Streng genommen wäre das kein reines MVVM, das erlaubt keine Models auf View-Ebene, allerdings ist das vermutlich auch eine Frage der Interpretation und des Geschmacks.
MMn. ist beides eine Option, gerade bei kleinen Projekten lohnt es nicht immer, für alles ein eigenes ViewModel zu bauen. Auf der anderen Seite musste ich aber schon oft genug ein ViewModel nachrüsten, weil ich nur so die Möglichkeit habe, zusätzliche View-Daten pro Item zu haben.

NuGet Packages im Code auslesen
lock Alternative für async/await

Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.

P
PierreDole Themenstarter:in
74 Beiträge seit 2017
vor 3 Jahren

Ok, es klapp. Nicht so ganz, wie im Beispiel mit zwei ViewModels, aber mit einem geht das. Auf jeden Fall hat es mein Hidden Value Problem gelöst, da ich vom SelectedItem das entsprechende Objekt zurückbekomme und nicht nur einen Listenindex. 😃

5.658 Beiträge seit 2006
vor 3 Jahren

eine Frage der Interpretation und des Geschmacks

Nee. Nur eine Frage der Funktionalität. Werden die Daten geändert und muß die UI über eine Änderung informiert werden, um die Bindings zu aktualisieren, braucht es ein ViewModel mit INotifyPropertyChange. Ansonsten nicht.

Weeks of programming can save you hours of planning

2.079 Beiträge seit 2012
vor 3 Jahren

Man kann MVVM aber auch so interpretieren, dass Models gar nicht an die View gebunden werden dürfen.
Das meine ich mit "Interpretation und Geschmack".

Ob das jetzt sinnvoll ist, muss jeder selbst entscheiden.

NuGet Packages im Code auslesen
lock Alternative für async/await

Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.