總結
先放結論:
datagrid的刷新方式:
- 重新綁定 ,全部刷新,最常用的,都知道
datagrid.itemsSource=null;
datagrid.itemsSource=list;
但有些時候不方便重新綁定,於是
- 針對數據源有增刪,需要實時顯示
將datagrid綁定的list<object>換成ObservableCollection<T>類型
- 只刷新特定列,需要繼承INotifyPropertyChanged接口,具體如下例子
問題描述
問題源於公司項目中對一系列報警條目做 啟用/屏蔽 開關,就是下面的小功能。
功能很順利完成了,但是點擊header上的總開關時,需要對整個datagrid刷新,才能讓下面的開關狀態正常顯示出來。但是這個datagrid里面數據量比較大,而且部分列是動態生成的,對整個datagrid刷新會出現部分動態生成列沒有正常加載。體驗很不好。如果能只刷新這一列,其他的列不管,就好了。
解決方案
實現INotifyPropertyChanged的ViewModel。
在datagrid綁定的數據實體類里,繼承INotifyPropertyChanged,實現該方法,並在要實時刷新的列的set中加上
OnPropertyChanged("ColumnName");
- 1
寫個列子:
public class student : INotifyPropertyChanged{ public event PropertyChangedEventHandler PropertyChanged; private void OnPropertyChanged(string propertyName) { if (this.PropertyChanged != null) this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } private bool _ischecked; public bool ischecked{ get { return _ischecked; } set { _ischecked=value; OnPropertyChanged("ischecked"); } } public string name { get; set; } }
如上設置之后,綁定ischecked的一列,只要數據源發生變化,data的這一列立馬就會刷新,其他列,如上面的name列,即使數據變化了,不重新綁定數據,該列不會刷新。如下圖的demo
Button點擊事件中同時改變了ischecked和name數據。但界面上只有checkbox列刷新了。
