簡介: 問題:在WPF中,使用了ObservableCollection<T>作為dataGrid的數據源,發現更新數據的時候不會觸發dataGrid的更新 By MaQaQ 2023-11-22 分析: 1、ObservableCollection 會在集合的元素添加、移除或者清空時才觸發更新通知 ...
簡介:
問題:在WPF中,使用了ObservableCollection<T>作為dataGrid的數據源,發現更新數據的時候不會觸發dataGrid的更新
By MaQaQ 2023-11-22
分析:
1、ObservableCollection 會在集合的元素添加、移除或者清空時才觸發更新通知,對集合中元素的屬性更改是不會觸發通知的。
2、如果想在更新數據時觸發通知,可以將 T類實現 INotifyPropertyChanged 介面,這樣當其屬性發生更改時,會觸發通知並更新 dataGrid。
實現如下:
1、xml中
<DataGrid x:Name="dataGrid" ItemsSource="{Binding}" >
2、cs中
- 定義ObservableCollection<Model> memberData = new ObservableCollection<Model>();
- Model定義如下:
public class Model : INotifyPropertyChanged { protected int id; protected string name; protected bool online; protected bool registered; public int ID { get => id; set => id = value; } public string Name { get => name; set => name = value; } public bool IsOnline { get => online; set { if (online != value) { online = value; OnPropertyChanged("IsOnline"); } } } public bool IsRegistered { get => registered; set { if (registered != value) { registered = value; OnPropertyChanged("IsRegistered"); } } } public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged(string name) { PropertyChangedEventHandler handler = PropertyChanged; if (handler != null) { handler(this, new PropertyChangedEventArgs(name)); } } }View Code
- 綁定dataGrid數據源:dataGrid.DataContext = memberData;
- 更新memberData數據:
private void ElevatorChanged(Data.ElevatorModel model) { var result1 = memberData.Count == 0 ? null : memberData.Where(p => p.Name == model.Name).Count() == 0 ? null : memberData.Where(p => p.Name == model.Name).First(); if (result1 != null) { result1.ID = model.ID; result1.Name = model.Name; result1.IsOnline = model.IsOnline; result1.IsRegistered = model.IsRegistered; } else { memberData.Add(model); } }View Code
上述例子中,當IsOnline、IsRegistered更新或者memberData.Add(model)時,會觸發通知並更新dataGrid的顯示。
總結:
1、使用ObservableCollection會在集合的元素添加、移除或者清空時才觸發更新2、使用INotifyPropertyChanged 介面會在屬性發生更改時觸發通知
本文來自博客園,作者:MaQaQ,轉載請註明原文鏈接:https://www.cnblogs.com/magicMaQaQ/p/17849078.html
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,否則保留追究法律責任的權利。