WPF привязывает список / коллекцию элементов к ListBox, но пользовательский интерфейс не обновляется после обновления элементов, Решено .
1114 Я просто тупой. Хотя я много читал об использовании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.
Для людей из Microsoft .NET
я думаю, что Silverlight будет ОГРОМНЫМ в следующие несколько, а возможно, и многие годы.