private void FilesListView_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (e.AddedItems.Count == 1)
            {
                // Cast the selected item to a FileStatisticsModel object
                FileStatisticsModel selected = (FileStatisticsModel)e.AddedItems[0];
                // Get the selected item's AbsolutePath attribute
                string path = selected.AbsolutePath;

                // TODO handle preview for .iaa files

                // If the selected item's path leads to an image...
                string[] validImageExtensions = { ".BMP", ".GIF", ".JPEG", ".JPG", ".PNG" };
                if (validImageExtensions.Contains(System.IO.Path.GetExtension(path).ToUpperInvariant()))
                {
                    // Set preview Image's source to the selected item's AbsolutePath
                    try
                    {
                        previewImage.Source = new BitmapImage(new Uri(path));
                    }
                    catch
                    {
                        previewImage.Source = null;
                    }
                }
            }
            else
            {
                previewImage.Source = null;
            }
        }
        private void filesListViewCM_EditData_Click(object sender, RoutedEventArgs e)
        {
            FileStatisticsModel selectedItem = (FileStatisticsModel)filesListView.SelectedItem;

            if (selectedItem == null)
            {
                return;
            }

            // Show an EditFileDataDialog dialog to edit the selected item's data
            EditFileDataDialog dialog = new EditFileDataDialog();

            dialog.FilePath         = selectedItem.AbsolutePath;
            dialog.DatabaseChanged += EditFileDataDialog_DatabaseChanged;
            dialog.Owner            = this;
            Nullable <bool> result = dialog.ShowDialog();
        }
        /// <summary>
        /// Starts a File Explorer process and navigates to filesListView's selected item's file.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void filesListViewCM_RevealInExplorer_Click(object sender, RoutedEventArgs e)
        {
            FileStatisticsModel selectedItem = (FileStatisticsModel)filesListView.SelectedItem;

            if (selectedItem == null)
            {
                return;
            }
            if (!File.Exists(selectedItem.AbsolutePath))
            {
                return;
            }

            // Launch File Explorer and select the file corresponding to selectedItem
            ProcessStartInfo startInfo = new ProcessStartInfo
            {
                Arguments = "/select, " + selectedItem.AbsolutePath /* command-line arguments */,
                FileName  = "explorer.exe"
            };

            Process.Start(startInfo);
        }
        /// <summary>
        /// On user's confirmation, deletes records for the selected file from the database, and refreshes
        /// the lists of displayed items.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void filesListViewCM_DeleteData_Click(object sender, RoutedEventArgs e)
        {
            FileStatisticsModel selectedItem = (FileStatisticsModel)filesListView.SelectedItem;

            if (selectedItem == null)
            {
                return;
            }

            // Prompt user to confirm deleting selected file's data
            DialogBox dialog = new DialogBox();

            dialog.Prompt = "Delete data for " + selectedItem.Name + "?";
            dialog.Owner  = this;
            Nullable <bool> result = dialog.ShowDialog();

            if (result != null && result == true)
            {
                // Delete selected file's data and refresh lists
                SqliteDataAccess.DeleteDataForFile(selectedItem.AbsolutePath);
                LoadStatistics(mTimeFrame, mSortMode);
            }
        }