在Wpf中使用ObservableCollection定义数组数据时,由于该类型变量已继承 INotifyCollectionChanged,所以无需重写get,set属性,只需声明get,set属性即可实现变量在改变时通知到界面,所以常常被用来定义需要Datagrid控件显示的内容,但是这里有个细节要注意,如果直接对ObservableCollection变量通过等号(=)赋值,界面是不会同步触发数据修改的。
举例如下:
声明变量
/// <summary>/// 原始检测数据/// </summary>publicObservableCollection<MyYoloData>MyDetectData{get;set;}=newObservableCollection<MyYoloData>();/// <summary>/// 检测数据汇总/// </summary>publicObservableCollection<DetectResult>MydetectDataSummary{get;set;}=newObservableCollection<DetectResult>();正确方法:使用如下代码1对变量进行赋值,界面会同步更新
MydetectDataSummary.Clear();ObservableCollection<DetectResult>MydetectDataSummaryTemp=CMain.Instacn.SummarryDetectData(MyDetectData);for(inti=0;i<MydetectDataSummaryTemp.Count;i++){MydetectDataSummary.Add(MydetectDataSummaryTemp[i]);}错误方法:使用如下代码2进行赋值,界面不会同步更新
MydetectDataSummary=CMain.Instacn.SummarryDetectData(MyDetectData);原因分析:
1.代码1不会改变变量的对象,改变的是集合的内容,会触发INotifyCollectionChanged事件从而界面改变
2.代码2会改变变量的实例对象,直接换了容器,界面绑定的是旧容器,旧的没有发生变化,所以界面不会更新
对策:
1.使用代码1
2.将ObservableCollection类别换成List数组,同时需继承INotifyPropertieChanged,重写get;set属性即可