2016-02-09 2 views
1

У меня есть ObservableCollection в моем ViewModel, который должен получить значения из файла JSON, следующим образом:Обновление всей ObservableCollection не уведомляет Binding управления

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

не обновляется, когда вся коллекция изменяется, как показано выше

Это потому, что связывание является предварительного ссылки подвергаются в 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)); 

Это таким образом обеспечит все изменения уведомления увольняют.

+0

Спасибо! Это сделал трюк. –

+0

@AviranKatz Добро пожаловать, сэр. Эта же проблема произошла со мной;) – MickyD

Смежные вопросы