WPF 将项目列表/集合绑定到 ListBox,但在项目更新后 UI 不刷新,已解决。
我只是愚蠢。虽然我已经阅读了很多关于 usingObservableCollection<>
而不是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 时可能需要进行的调整的一部分。