WPF, das eine Liste/Auflistung von Elementen an eine ListBox bindet, aber die Benutzeroberfläche nach Aktualisierung der Elemente nicht aktualisiert, Gelöst.
Ich bin nur dumm. Während ich viel über die Verwendung von ObservableCollection<>
anstelle von List<>
gelesen hatte, ignorierte ich einfach weiter diesen Vorschlag und ging anderen Vorschlägen folgen, ohne Erfolg. Kehre zu meinen Büchern zurück und lese sie noch einmal. Es ist ziemlich gut erklärt, dass ObservableCollection<>
ein Muss ist, weil List<>
nicht die Schnittstelle für die ListBox
benötigt, um seine Anzeige zu aktualisieren, wenn die Elemente in der Sammlung ändern.
Dies ist der aktualisierte Code:
private ObservableCollection<StringWrapper> m_AppLog;
ObservableCollection<StringWrapper> Log { get { return m_AppLog; } }
Ziemlich einfach und erfordert nicht etwas anderes (z Refresh()).Da ObservableCollection selbst Auslösefall der Änderung kümmert, konnte ich den unnötigen Anruf entfernen:
// notify bound objects
OnPropertyChanged("Log");
ObservableCollection
kein Update von einem Thread unterstützen, die es nicht schaffen haben. Weil meine Liste (ein visuelles Protokoll der letzten Fehler/Infomeldungen zeigen) kann aus verschiedenen Threads aktualisiert werden, füge ich meinen Code auf diese Weise anzupassen, um die Aktualisierung zu gewährleisten, wurde mit der Liste der eigenen Dispatcher getan:
public void AddToLog(string message) {
if (Thread.CurrentThread != Dispatcher.Thread) {
// Need for invoke if called from a different thread
Dispatcher.Invoke(
DispatcherPriority.Normal, (ThreadStart)delegate() { AddToLog(message); });
}
else {
// add this line at the top of the log
m_AppLog.Insert(0, new StringWrapper(message));
// ...
Beachten Sie auch, dass ObservableCollection<>
RemoveRange()
im Gegensatz zu List<>
nicht unterstützt. Dies ist Teil der möglichen Anpassungen, die beim Wechsel von List zu ObservableCollection erforderlich sind.
Können Sie bitte genauer erklären, was Sie mit "wenn sich die Sammlung ändert, alle Artikel aktualisieren ihre Position", nur so kann ich sicher sein, dass ich Ihre Frage richtig beantworte? – Donnelle