WPF: Binding Liste, ListBox
Ich habe eine Klasse:
public class A : INotifyPropertyChanged
{
public List<B> bList { get; set; }
public void AddB(B b)
{
bList.Add(b);
NotifyPropertyChanged("bList");
}
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(string info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
}
Sowie eine verbindliche (DataContext des UserControl ist eine Instanz von A):
<ListBox ItemsSource="{Binding Path=bList}" />
Elemente angezeigt, das Listenfeld wird nicht aktualisiert, nachdem neue Objekt in der Liste zu finden
Nach ändern der Liste, ObservableCollection und entfernen der NotifyPropertyChanged handler funktioniert alles.
Warum die Liste nicht funktioniert?
Bitte poste deinen richtigen code... Der code, den Sie geschrieben hat, kann nicht funktionieren, auch mit einer ObservableCollection. Und die NotifyPropertyChanged ändert sich nichts, da Sie Sie nicht verwenden
InformationsquelleAutor Damian | 2011-05-19
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
muss Ihr Grundstückpublic
oder die Bindung Motor nicht in der Lage sein, darauf zuzugreifen.EDIT:
Das ist genau, warum die
ObservableCollection<T>
Klasse eingeführt wurde...ObservableCollection<T>
implementiertINotifyCollectionChanged
, die es ermöglicht, Benachrichtigen Sie die Benutzeroberfläche, wenn ein Element Hinzugefügt/entfernt/ersetzt.List<T>
nicht löst keine Benachrichtigung, so sind die UI nicht erkennen kann, wenn der Inhalt der Liste geändert hat.Die Tatsache, dass Sie erhöhen die
PropertyChanged
Ereignis wird aktualisieren Sie die Bindung, dann aber merkt, dass es die gleiche Instanz vonList<T>
wie vor, so dass es verwendet die gleichenICollectionView
alsItemsSource
, und der Inhalt derListBox
nicht aktualisiert.siehe meine aktualisierte Antwort
Danke für die Antwort 🙂
Vielen Dank, die erklären, warum
ObservableCollection
ist nützlich bei der Datenbindung.InformationsquelleAutor Thomas Levesque
Erster Gedanke ist, dass Sie versuchen, eine Bindung zu einem privaten member. Das ist sicherlich nicht richtig erscheint.
InformationsquelleAutor Tim
Ich denke, dass das problem ist, dass, obwohl Sie benachrichtigt werden, die den verbindlichen Rahmen, der die Eigenschaft hat sich geändert, der tatsächliche Wert der Immobilie bleibt das gleiche. Das ist zu sagen, dass, obwohl die listbox möglicherweise neu zu bewerten den Wert Ihrer ItemsSource-Bindung, wird er feststellen, dass es immer noch das gleiche Objekt-Instanz als zuvor. Zum Beispiel vorstellen, dass die listbox reagiert auf die Eigenschaft geändert-Ereignis irgendwie ähnlich wie die unten.
In deinem Beispiel, würde dies bedeuten, wäre es nicht bewerten die Artikel.
Hinweis: ich weiß nicht wissen wie die listbox arbeitet mit der ItemsSource-Eigenschaft - ich bin nur spekulieren!
InformationsquelleAutor Steve Greatrex
ObservableCollections senden CollectionChanged Ereignisse nicht PropertyChanged-Ereignisse
InformationsquelleAutor Yaur
Durch die Signalisierung
sind Sie im Grunde sagt, Sie haben eine neue Liste Objekt, nicht, dass der Inhalt der Liste geändert hat.
Wenn Sie Ändern Sie den Typ ObservableCollection, die Sammlungen automatisch sendet
Meldungen, dass die Sammlung Elemente geändert haben, das ist, was Sie wollen.
InformationsquelleAutor Jens H