private void RefreshViewCollection(bool openNewEntry = true) { // Merge / update differences between the currentTimeEntries and viewCollection // Use reverse for-int loop so we can modify the collection. for (int i = viewCollection.Count - 1; i >= 0; i--) { TimeEntryView view = viewCollection[i]; int id = view.GetId(); if (!entryByIds.ContainsKey(id)) { continue; } // check if we deleted a record from CurrentTimeEntries // viewCollection could be out of date here if (!CurrentTimeEntries.Contains(entryByIds[id])) { viewCollection.RemoveAt(i); continue; } // update row details every tick TimeEntryView newView = entryByIds[id].ToView(id); view.Active = newView.Active; view.Hours = newView.Hours; view.Name = newView.Name; view.Details = newView.Details; } // Insert new foreach (TimeEntry entry in CurrentTimeEntries) { if (entryByIds.ContainsValue(entry)) { continue; } int newId = entryByIds.Keys.Count + 1; entryByIds[newId] = entry; var newRow = entry.ToView(newId); viewCollection.Add(newRow); if (openNewEntry) { // autoselect newest entry TableGrid.SelectedItem = newRow; TableGrid.ScrollIntoView(newRow); DisplayDetails(true); // trigger Edit window } } //viewCollection.Clear(); //foreach (TimeEntry entry in currentTimeEntries) //{ // viewCollection.Add(entry.ToView()); //} TotalHours.Text = CurrentTimeEntries.Sum(m => m.DurationHours) .ToString("0.00") + " total hours"; }