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

时间:2016-02-09 06:15:22

标签: c# mvvm data-binding observablecollection

我的ObservableCollection中有一个ViewModel,应该从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)仅在添加或删除项目时才更新,并且在更改整个集合时不会更新,如上所示。

1 个答案:

答案 0 :(得分:1)

  如上所示,当整个集合发生变化时,

不会更新

这是因为绑定是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));

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