WPF привязывает список/набор элементов к ListBox, но UI не обновляется после обновленных элементов, Решено.
Я просто глуп. Хотя я много читал об использовании ObservableCollection<>
вместо List<>
, я просто продолжал игнорировать это предложение и пошел дальше других предложений, но безрезультатно. Вернулся к моим книгам и перечитал. Довольно хорошо объяснено, что ObservableCollection<>
является обязательным для использования, потому что List<>
не предоставляет интерфейс INotifyCollectionChange
, необходимый для ListBox
, чтобы обновить его отображение при изменении элементов в коллекции.
Это обновленный код:
private ObservableCollection<StringWrapper> m_AppLog;
ObservableCollection<StringWrapper> Log { get { return m_AppLog; } }
Довольно просто, и больше ничего не требуется (например, Refresh()).Поскольку ObservableCollection заботится само срабатывание события изменения, я был в состоянии удалить ненужный вызов:
// notify bound objects
OnPropertyChanged("Log");
ObservableCollection
не поддерживает обновления на волоске, который не создавал его. Потому что мой список (визуальный журнал, чтобы показать последние ошибки/информационные сообщения) могут быть обновлены из разных потоков, я добавляю, чтобы настроить мой код таким образом, чтобы обеспечить обновление было сделано с собственным диспетчером входящих в список:
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));
// ...
Также обратите внимание, что ObservableCollection<>
не поддерживает RemoveRange()
вопреки List<>
. Это часть возможных корректировок, необходимых при переключении с List на ObservableCollection.
Не могли бы вы дать более подробную информацию о том, что вы подразумеваете под «когда коллекция меняется, все элементы обновляют свою позицию», так что я могу быть уверен, что правильно отвечаю на ваш вопрос? – Donnelle