WPF中ObservableCollection更新后ListView未同步刷新问题咨询
问题原因排查与解决方案
核心常见问题及修复方案
问题1:未使用同一个ViewModel实例或未正确设置DataContext
若你调用addTask方法的TasksViewModel实例,和ListView绑定的DataContext对应的实例不是同一个,新增数据自然不会同步到界面。如果连初始加载的3条测试数据都不显示,基本可以判定是未正确设置DataContext导致。
修复方案:- 在页面的构造函数中全局只实例化一次ViewModel,同时绑定为页面的DataContext:
public MainWindow() { InitializeComponent(); // 全局仅实例化一次,后续所有操作都使用这个实例 var taskViewModel = new TasksViewModel(); this.DataContext = taskViewModel; }- 后续调用
addTask时,直接使用绑定到DataContext的这个实例,不要重新new新的TasksViewModel对象。
问题2:在非UI线程调用addTask方法
ObservableCollection的集合变更通知默认不会自动跨线程调度到UI线程,如果你在后台工作线程执行Add操作,UI线程收不到变更通知,就不会更新界面。
修复方案:调用addTask时将操作调度到UI线程执行:Application.Current.Dispatcher.Invoke(() => { // 这里调用你绑定的ViewModel实例的addTask方法 taskViewModel.addTask("新任务", "09:00", "11:30", "张三", "测试任务"); });优化建议:避免集合实例被意外修改
你当前代码中_UsersList是公开可写的属性,如果外部代码不小心对_UsersList重新赋值,会导致界面绑定的还是旧的集合实例,新增数据不会同步。建议修改ViewModel代码:// 改成私有只读字段,禁止外部修改集合实例 private readonly ObservableCollection<Tasks> _UsersList = new ObservableCollection<Tasks>(); public ObservableCollection<Tasks> Tasks { get { return _UsersList; } }
内容的提问来源于stack exchange,提问作者WPF noob
相关产品推荐
相关产品推荐

