更新整个 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));
这样做将确保触发所有更改通知。
我的 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
属性
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));
这样做将确保触发所有更改通知。