You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

XAML中使用ListBox时如何实现添加项后的显示更新

解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:34:07