【问题标题】:Updating entire ObservableCollection doesn't notify Binding control更新整个 ObservableCollection 不会通知绑定控件
【发布时间】:2016-05-19 00:44:38
【问题描述】:

我的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) 仅在添加或删除项目时才会更新,而在整个集合更改时不会更新,如上所示。

【问题讨论】:

    标签: c# mvvm data-binding observablecollection


    【解决方案1】:

    当整个集合被更改时不会更新,如上所示

    这是因为绑定是之前RecordList属性中公开的引用。

    以下行在RecordList 属性上创建一个 对象

    RecordList = ser.Deserialize<ObservableCollection<Record>>(JSONString);
    

    现在您的内存中有两个ObservableCollection&lt;&gt;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));
    

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

    【讨论】:

    • @AviranKatz 先生,不客气。同样的问题也发生在我身上;)
    猜你喜欢
    • 2012-02-29
    • 2011-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多