WPF DataGrid绑定BindingList添加数据后UI不更新问题求助
解决WPF中BindingList绑定DataGrid后添加数据不更新UI的问题
我看了你的代码,问题出在Sessions属性的初始化时机和变更通知上,下面给你分析原因和两种可行的解决方案:
问题根源
虽然BindingList<T>本身实现了IBindingList接口,支持集合元素添加/删除时的UI通知,但你的代码里犯了两个关键错误:
- 你在
InitializeComponent()之后才给Sessions赋值,而XAML中已经把DataContext绑定到了MainWindow自身,这时候UI已经完成了初始绑定,而Sessions属性没有触发PropertyChanged通知,导致UI不知道这个属性已经被赋值为新的BindingList<Session>实例。 - 你之前尝试让MainWindow实现
INotifyPropertyChanged,但大概率没有给Sessions属性添加变更通知逻辑,所以即便后续赋值,UI也感知不到。
解决方案1:给MainWindow添加INotifyPropertyChanged实现并修正Sessions属性
这是最规范的做法,确保属性变更时能通知UI:
修改MainWindow.xaml.cs如下:
using System.ComponentModel; using System.Runtime.CompilerServices; using System.Windows; namespace WpfTestApp1 { public class Session : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; private string _title; public string Title { get => _title; set { _title = value; OnPropertyChanged(); } } private string _host; public string Host { get => _host; set { _host = value; OnPropertyChanged(); } } protected void OnPropertyChanged([CallerMemberName] string propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } } public partial class MainWindow : Window, INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; private BindingList<Session> _sessions; public BindingList<Session> Sessions { get => _sessions; set { _sessions = value; OnPropertyChanged(); } } public MainWindow() { InitializeComponent(); Sessions = new BindingList<Session>(); } private void BtnTest_OnClick(object sender, RoutedEventArgs e) { Sessions.Add(new Session(){Title = "test1", Host="test2"}); } protected void OnPropertyChanged([CallerMemberName] string propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } } }
解决方案2:提前初始化Sessions(快速修复)
如果你不想给MainWindow添加INotifyPropertyChanged,也可以在InitializeComponent()之前初始化Sessions,这样UI绑定的时候集合已经存在,后续BindingList的变更通知就能正常触发:
修改MainWindow构造函数:
public MainWindow() { Sessions = new BindingList<Session>(); // 先初始化集合 InitializeComponent(); // 再初始化UI } // 同时把Sessions属性改成只读或者保留原来的写法,但必须提前初始化 public BindingList<Session> Sessions { get; set; }
为什么这样能解决问题?
- 方案1通过给
Sessions属性添加PropertyChanged通知,确保当属性值(集合实例)变更时,UI能收到通知并重新绑定到新的集合,之后BindingList的添加/删除操作自带的通知就能让DataGrid更新。 - 方案2让UI在初始化时就绑定到已经存在的
BindingList实例,后续集合的变更通知(由BindingList自身提供)就能直接被DataGrid接收,从而更新UI。
你可以根据自己的需求选择其中一种方案,两种都能解决你遇到的UI不更新问题。
内容的提问来源于stack exchange,提问作者Jamesits
相关产品推荐
相关产品推荐

