Entwickler-Ecke
WinForms - ListBox und INotifyPropertyChanged
k-weddige - Do 06.11.08 10:38
Titel: ListBox und INotifyPropertyChanged
Moin,
ich habe ein Projekt, in dem ich Daten, die ich in Objekten speicher, die ich in einer BindingList verwalte, in einer Listbox anzeigen möchte.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| public class Character : INotifyPropertyChanged { [...] public event PropertyChangedEventHandler PropertyChanged; [...] public string Surename { get { return mySurename; } set { mySurename = value; if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs("Surename")); } } } [...] }
public class CharacterList : BindingList<Character> {[...]} |
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| private CharacterList data = new CharacterList(); [...] private void Form1_Load(object sender, EventArgs e) { listBoxData.DataSource = data; listBoxData.DisplayMember = "ShortName"; [...] } |
Wenn ich nun ein neues Objekt zu data hinzufüge, ist das kein Problem. Auch löschen geht tadellos. Aber wenn ich nun einen Datensatz verändere, sollte das eigentlich in der ListBox angezeigt werden. Leider bleibt die betroffene Zeile unberührt und einer (belibige?) anderen Zeile wird dann der neue Wert zugewiesen. Der Datensatz, der ursprünglich an der neuen Stelle stand, wird nicht mehr angezeigt.
TIA
Konstantin
Th69 - Do 06.11.08 11:59
Ich denke, der Fehler liegt darin, daß du ein eigenes PropertyChanged Event generiert hast (womit hast du dieses denn verbunden?).
Du solltest nur das PropertyChanged-Event der BindingList auslösen.
k-weddige - Do 06.11.08 12:19
Th69 hat folgendes geschrieben : |
| Ich denke, der Fehler liegt darin, daß du ein eigenes PropertyChanged Event generiert hast (womit hast du dieses denn verbunden?). |
Um die Behandlung sollte sich eigentlich die BindingList selbstständig kümmern und das macht sie wohl auch: Schließlich verändert sich die ListBox, wenn ich ein Item ändere. Nur die korrekte Darstellung der Daten funktioniert nicht. Ein Item wird doppelt (mit zwei verschiedenen Beschriftungen) und dafür ein anderes gar nicht angezeigt.
Th69 hat folgendes geschrieben : |
| Du solltest nur das PropertyChanged-Event der BindingList auslösen. |
Das wird schwierig, weil das Item ja nichts von seiner Liste weiß.
Konstantin
Christian S. - Do 06.11.08 12:54
Th69 hat folgendes geschrieben : |
| Ich denke, der Fehler liegt darin, daß du ein eigenes PropertyChanged Event generiert hast (womit hast du dieses denn verbunden?). |
Er implementiert INotifyPropertyChanged, das ist schon richtig.
Th69 hat folgendes geschrieben : |
| Du solltest nur das PropertyChanged-Event der BindingList auslösen. |
Nein, es ändert sich ja nicht die Eigenschaft der BindingList, sondern des Character.
@k-weddige: Das sieht eigentlich richtig aus. Hast Du irgendeine Sortierung in der Listbox aktiv, sodass da etwas umsortiert wird, wenn sich eine Eigenschaft ändert?
k-weddige - Do 06.11.08 12:59
Danke! :D
Ich hatte bei der ListBox Sorted aktiviert. :oops:
Konstantin
Christian S. - Do 06.11.08 13:03
Schön, dass das geklappt hat :-)
Noch ein Hinweis: Ich würde im Setter noch prüfen, ob value != mySurename ist und nur dann den Wert setzen und das Ereignis auslösen.
k-weddige - Do 06.11.08 13:19
Christian S. hat folgendes geschrieben : |
| Noch ein Hinweis: Ich würde im Setter noch prüfen, ob value != mySurename ist und nur dann den Wert setzen und das Ereignis auslösen. |
Das ist sinnvoll. Danke für den Hinweis, ich werde das einbauen.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!