WPF数据绑定手动更新指南

3

我有一个来自非WPF程序集的List<Foo>,我试图将其数据绑定到WPF <ListBox>。最初,列表项正确显示,但是当我向List<Foo>添加新项时,listbox不会添加列表项。我该如何告诉列表框重新绑定/更新/刷新数据并显示新项目?

3个回答

10

虽然使用ObservableCollection是最好的方法,但回答实际问题的方式是手动调用BindingExpression.UpdateTarget来更新。


你在问题的场景中尝试过这个吗?我问这个的原因是因为我认为如果集合是相同的引用(如果你创建一个新的集合,那么这将强制重新绑定,或者如果你首先将源设置为null),UpdateTarget将不会更新列表。 - Scott

4
你应该使用ObservableCollection,这样你就可以自动获得更新。

我可以在非WPF程序集中使用ObservableCollection吗? - harriyott
是的,如果您包括PresentationBase(我认为,该类在System.Collections.ObjectModel中,但实现在PresetationBase中);或者如果您想获得相同的功能,请通过实现INotifyCollectionChanged来创建自己的ObservableCollection。 - Scott
它在WindowsBase中,我同意。通常没有理由暴露除ICollection<T>或IList<T>之外的任何内容,因此您始终可以稍后更换实现。 - Kent Boogaart

2

感谢您发布此答案。即使您使用ObservableCollection,如果集合不在UI线程中,您可能仍需要使用BindingExpression.UpdateTarget。我一直在编写一些多线程WPF应用程序,并发现当我将模型代码移动到另一个线程时,我不得不剥离数据绑定,因为我无法确保更新系统真正起作用。虽然我认为数据绑定是一个很好的概念,但是我认为数据绑定系统的不透明性对我采用它构成了实际障碍。(抱歉发牢骚!)再次感谢,Adam。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接