public void Save() { TryStartDataOperationAndThenNavigate(async delegate { if (StartTime >= EndTime) { new PortableMessageDialog("Your end time must be greater than your start time.", "Invalid end time").Show(); return; } if (DayOfWeeks.Count == 0) { new PortableMessageDialog("You must select at least one day of week. If you want to delete this time, use the delete option in the menu.", "No day of weeks").Show(); return; } var updatedAndNewSchedules = new List <DataItemSchedule>(); Guid classId = AddParams != null ? AddParams.Class.Identifier : EditParams.GroupedSchedules.First().Class.Identifier; // Get the existing schedules List <ViewItemSchedule> existingSchedules = EditParams != null ? EditParams.GroupedSchedules.ToList() : new List <ViewItemSchedule>(); for (int i = 0; i < DayOfWeeks.Count; i++) { DayOfWeek dayOfWeek = DayOfWeeks[i]; // First try to find an existing schedule that already matches this day of week ViewItemSchedule existingSchedule = existingSchedules.FirstOrDefault(s => s.DayOfWeek == dayOfWeek); // If we couldn't find one, try picking a schedule that doesn't have any day of week matches if (existingSchedule == null) { existingSchedule = existingSchedules.FirstOrDefault(s => !DayOfWeeks.Contains(s.DayOfWeek)); } // Remove the schedule we added if (existingSchedule != null) { existingSchedules.Remove(existingSchedule); } DataItemSchedule dataItem = new DataItemSchedule() { Identifier = existingSchedule != null ? existingSchedule.Identifier : Guid.NewGuid(), UpperIdentifier = classId, StartTime = AsUtc(StartTime), EndTime = AsUtc(EndTime), Room = Room, DayOfWeek = dayOfWeek, ScheduleWeek = ScheduleWeek, ScheduleType = PowerPlannerSending.Schedule.Type.Normal }; updatedAndNewSchedules.Add(dataItem); } // Deleted schedules are any remaining existing schedules var deletedScheduleIds = existingSchedules.Select(i => i.Identifier).ToArray(); DataChanges changes = new DataChanges(); foreach (var s in updatedAndNewSchedules) { changes.Add(s); } foreach (var id in deletedScheduleIds) { changes.DeleteItem(id); } if (!changes.IsEmpty()) { await PowerPlannerApp.Current.SaveChanges(changes); } }, delegate { this.RemoveViewModel(); }); }