更新整个 ObservableCollection 不会通知 Binding 控件

Updating entire ObservableCollection doesn't notify Binding control

我的 ViewModel 中有一个 ObservableCollection,它应该从 json 文件中获取其值,如下所示:

public MainViewModel()
{
    RecordList = new ObservableCollection<Record>();
}
public void ReadJsonFile(string FileName)
{
    if (!FileName.ToUpper().EndsWith(".JSON")) return;
    String JSONString = File.ReadAllText(FileName);
    JavaScriptSerializer ser = new JavaScriptSerializer();
    RecordList = ser.Deserialize<ObservableCollection<Record>>(JSONString);
}

问题是绑定控件 (DataGrid) 只有在添加或删除项目时才会更新,而当整个集合发生更改时不会更新,如上所示。

doesn't get updated when the entire collection is changed, as seen above

那是因为绑定是 prior 引用暴露在 RecordList 属性.

以下行在 RecordList 属性

上创建一个 new 对象
RecordList = ser.Deserialize<ObservableCollection<Record>>(JSONString);

现在你的内存中有两个 ObservableCollection<>DataGrid 仍然绑定到原始列表。

考虑将代码替换为:

RecordList.Clear(); // don't create new, merely clear-and-append

foreach (var item in ser.Deserialize<ObservableCollection<Record>>(JSONString)) 
{
   RecordList.Add(item);
}

...或者也许:

RecordList.Clear(); // don't create new, merely clear-and-append
ser.Deserialize<List<Record>>(JSONString).ForEach (x = > RecordList.Add(x));

这样做将确保触发所有更改通知。