WPF:将列表绑定到ListBox
我上课了:
public class A : INotifyPropertyChanged { public List bList { get; set; } public void AddB(B b) { bList.Add(b); NotifyPropertyChanged("bList"); } public event PropertyChangedEventHandler PropertyChanged; private void NotifyPropertyChanged(string info) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(info)); } } }
和绑定(UserControl的DataContext是A的一个实例):
显示元素,将新对象添加到List后ListBox不会更新
将列表更改为ObservableCollection并删除NotifyPropertyChanged处理程序后,一切正常。
为什么列表不起作用?
您的财产必须是 public
,否则绑定引擎将无法访问它。
编辑:
将列表更改为ObservableCollection并删除NotifyPropertyChanged处理程序后,一切正常。
这正是引入ObservableCollection
类的原因…… ObservableCollection
实现了INotifyCollectionChanged
,它允许它在添加/删除/替换项目时通知UI。 List
不会触发任何通知,因此UI无法检测列表内容何时发生更改。
提升PropertyChanged
事件的事实确实刷新了绑定,但随后它意识到它与之前的List
实例相同,因此它重用了与ItemsSource
相同的ICollectionView
,并且ListBox
的内容未刷新。
首先想到的是你正试图绑定到私人成员。 这当然不对。
我认为问题是,虽然您通知绑定框架该属性已更改,但该属性的实际值仍然相同。 也就是说,尽管列表框可能会重新评估其ItemsSource绑定的值,但它会发现它仍然是与之前相同的对象实例 。 例如,假设列表框以某种方式对属性更改事件作出反应,类似于下面的内容。
private void OnItemsSourceBindingChanged() { var newValue = this.EvaluateItemsSourceBinding(); if (newValue != this.ItemsSource) //it will be equal, as its still the same list { this.AddNewItems(); } }
在您的示例中,这意味着它不会重新评估项目。
注意:我不知道列表框如何与ItemsSource属性一起使用 – 我只是在猜测!
ObservableCollections发送CollectionChanged事件而不是PropertyChanged事件
通过信号
NotifyPropertyChanged("bList");
你基本上说你有一个新的列表对象,而不是列表的内容已经改变。
如果将类型更改为ObservableCollection,则集合会自动发送
CollectionChanged
集合项已更改的通知,这是您想要的。