XAML中使用ListBox时如何实现添加项后的显示更新
嘿,我来帮你搞定这个问题!你遇到的核心问题其实出在**ArrayList这个集合类型本身**,和你调用的InvalidateArrange()、UpdateLayout()没关系——这两个方法只是用来刷新控件的布局,根本解决不了数据源变化通知的问题。
为什么ArrayList不行?
ArrayList是.NET里比较老旧的集合类,它没有实现INotifyCollectionChanged接口。WPF的绑定系统依赖这个接口来感知集合的变化:当你往集合里加、删或者修改项时,这个接口会自动触发通知,告诉绑定的ListBox“数据源变了,你得更新显示”。而ArrayList完全没有这个能力,所以哪怕你加了新项,ListBox根本不知道这回事,自然不会更新。
最佳解决方案:换成ObservableCollection<T>
WPF官方推荐用ObservableCollection<T>来做绑定的数据源,它天生就实现了INotifyCollectionChanged接口,完美解决自动更新的问题。
给你举个简单的代码示例:
// 1. 先引用命名空间(如果没引的话) using System.Collections.ObjectModel; // 2. 声明ObservableCollection代替ArrayList // 如果你的项是字符串就用<string>,是自定义对象就换成你的类名 ObservableCollection<string> myDataList = new ObservableCollection<string>(); // 3. 把它赋值给ListBox的ItemsSource listBox.ItemsSource = myDataList; // 4. 当你添加新项时,ListBox会自动更新! myDataList.Add("新增的内容");
这样一来,你每次调用Add()(或者Remove()、Clear()等方法),ObservableCollection都会自动给ListBox发通知,ListBox就会立刻显示新的内容,完全不用手动调用刷新方法。
如果一定要用ArrayList怎么办?(不推荐)
要是因为某些原因你必须保留ArrayList,那只能手动强制ListBox重新加载数据源,代码大概是这样:
// 添加新项到ArrayList myArrayList.Add("新增内容"); // 手动刷新ItemsSource listBox.ItemsSource = null; listBox.ItemsSource = myArrayList;
不过这个方法很不优雅,因为它会让ListBox重新加载整个集合,性能不如ObservableCollection,而且代码也麻烦,所以还是强烈建议你换成ObservableCollection。
内容的提问来源于stack exchange,提问作者Emma

