private async void StartDoneButton_Click(object sender, RoutedEventArgs e)
        {
            // This list will hold key / value pairs that will be bound to the datagrid feedback, 
            // which is the way to make those pairs appear in the data grid during background worker progress updates
            ObservableCollection<DateTimeRereadFeedbackTuple> feedbackRows = new ObservableCollection<DateTimeRereadFeedbackTuple>();
            this.FeedbackGrid.ItemsSource = feedbackRows;
            this.CancelButton.IsEnabled = false;
            this.StartDoneButton.Content = "_Done";
            this.StartDoneButton.Click -= this.StartDoneButton_Click;
            this.StartDoneButton.Click += this.DoneButton_Click;
            this.StartDoneButton.IsEnabled = false;

            IProgress<DateTimeRereadFeedbackTuple> rereadStatus = new Progress<DateTimeRereadFeedbackTuple>(this.ReportProgress);
            DateTimeRereadFeedbackTuple rereadProgress = new DateTimeRereadFeedbackTuple("Pass 1: Examining images and videos...", "Checking if dates/time differ");
            rereadStatus.Report(rereadProgress);
            await Task.Run(() =>
            {
                // check to see what date/times need updating
                List<ImageRow> filesToAdjust = new List<ImageRow>();
                int count = this.database.CurrentlySelectedFileCount;
                TimeZoneInfo imageSetTimeZone = this.database.ImageSet.GetTimeZone();
                for (int fileIndex = 0; fileIndex < count; ++fileIndex)
                {
                    ImageRow file = this.database.Files[fileIndex];
                    DateTimeOffset originalDateTime = file.GetDateTime();
                    string feedbackMessage = String.Empty;
                    try
                    {
                        DateTimeAdjustment dateTimeAdjustment = file.TryReadDateTimeOriginalFromMetadata(this.database.FolderPath, imageSetTimeZone);
                        if (dateTimeAdjustment == DateTimeAdjustment.None)
                        {
                            // couldn't read metadata, so get a candidate date/time from the file
                            file.SetDateTimeOffsetFromFileInfo(this.database.FolderPath, imageSetTimeZone);
                            feedbackMessage = "Using file date/time: ";
                        }
                        else if ((dateTimeAdjustment & DateTimeAdjustment.PreviousMetadata) == DateTimeAdjustment.PreviousMetadata)
                        {
                            feedbackMessage = "Using previous metadata date/time: ";
                        }
                        else
                        {
                            feedbackMessage = "Using metadata date/time: ";
                        }

                        DateTimeOffset rescannedDateTime = file.GetDateTime();
                        bool updateNeeded = false;
                        if (rescannedDateTime.Date == originalDateTime.Date)
                        {
                            feedbackMessage += "same date, ";
                        }
                        else
                        {
                            updateNeeded = true;
                            feedbackMessage += "different date, ";
                        }

                        if (rescannedDateTime.TimeOfDay == originalDateTime.TimeOfDay)
                        {
                            feedbackMessage += "same time, ";
                        }
                        else
                        {
                            updateNeeded = true;
                            feedbackMessage += "different time, ";
                        }

                        if (rescannedDateTime.Offset == originalDateTime.Offset)
                        {
                            feedbackMessage += "same UTC offset";
                        }
                        else
                        {
                            updateNeeded = true;
                            feedbackMessage += "different UTC offset";
                        }

                        if (updateNeeded)
                        {
                            filesToAdjust.Add(file);
                        }
                    }
                    catch (Exception exception)
                    {
                        Debug.Fail(String.Format("Unexpected exception processing '{0}'.", file.FileName), exception.ToString());
                        feedbackMessage += String.Format(" , skipping due to {0}: {1}.", exception.GetType().FullName, exception.Message);
                    }

                    if (fileIndex % Constant.ThrottleValues.SleepForImageRenderInterval == 0)
                    {
                        rereadProgress.FileName = file.FileName;
                        rereadProgress.Message = feedbackMessage;
                        rereadStatus.Report(new DateTimeRereadFeedbackTuple(file.FileName, feedbackMessage));
                        Thread.Sleep(Constant.ThrottleValues.RenderingBackoffTime); // Put in a delay every now and then, as otherwise the UI won't update.
                    }
                }

                // Pass 2. Update each date as needed 
                rereadProgress.FileName = String.Empty;
                rereadProgress.Message = String.Empty;
                rereadStatus.Report(rereadProgress);  // A blank separator
                rereadProgress.FileName = "Pass 2: Updating date/times";
                rereadProgress.Message = String.Format("Updating {0} images and videos...", filesToAdjust.Count);
                rereadStatus.Report(rereadProgress);

                List<ColumnTuplesWithWhere> imagesToUpdate = new List<ColumnTuplesWithWhere>();
                foreach (ImageRow image in filesToAdjust)
                {
                    imagesToUpdate.Add(image.GetDateTimeColumnTuples());
                }
                database.UpdateFiles(imagesToUpdate);  // Write the updates to the database
                rereadProgress.FileName = String.Empty;
                rereadProgress.Message = "Done";
                rereadStatus.Report(rereadProgress);
            });

            this.StartDoneButton.IsEnabled = true;
        }
 private void ReportProgress(DateTimeRereadFeedbackTuple progress)
 {
     ObservableCollection<DateTimeRereadFeedbackTuple> feedbackRows = (ObservableCollection<DateTimeRereadFeedbackTuple>)this.FeedbackGrid.ItemsSource;
     feedbackRows.Add(progress);
     this.FeedbackGrid.ScrollIntoView(this.FeedbackGrid.Items[this.FeedbackGrid.Items.Count - 1]);
 }