/// <summary>
        /// Show file select dialog.
        /// </summary>
        /// <param name="dialogService"></param>
        /// <param name="title">Dialog title.</param>
        /// <param name="canMultiSelect">If true; can multi select.</param>
        /// <param name="callBack">Callback action.</param>
        /// <param name="isModal">If true; dialog is shown as a modal.</param>
        /// <param name="fileNamePrefixText">File name prefix text.</param>
        /// <param name="selectButtonText">Select button text.</param>
        /// <param name="cancelButtonText">Cancel button text.</param>
        /// <param name="textResource">Text resource for explorer.</param>
        /// <param name="filters">File filters.</param>
        /// <param name="rootFolders">Root folders path.</param>
        public static void ShowFileSelectDialog(this IDialogService dialogService,
                                                string title,
                                                bool canMultiSelect,
                                                Action <IDialogResult> callBack,
                                                bool isModal = true,
                                                string fileNamePrefixText             = null,
                                                string selectButtonText               = null,
                                                string cancelButtonText               = null,
                                                ExplorerBaseTextResource textResource = null,
                                                IEnumerable <FileFilter> filters      = null,
                                                IEnumerable <string> rootFolders      = null)
        {
            var param = new DialogParameters
            {
                { DialogParameterNames.Title, title },
                { DialogParameterNames.CanMultiSelect, canMultiSelect },
            };

            if (!string.IsNullOrEmpty(fileNamePrefixText))
            {
                param.Add(DialogParameterNames.FileNamePrefixText, fileNamePrefixText);
            }
            if (!string.IsNullOrEmpty(selectButtonText))
            {
                param.Add(DialogParameterNames.SelectButtonText, selectButtonText);
            }
            if (!string.IsNullOrEmpty(cancelButtonText))
            {
                param.Add(DialogParameterNames.CancelButtonText, cancelButtonText);
            }
            if (textResource != null)
            {
                param.Add(DialogParameterNames.TextResource, textResource);
            }
            if (filters != null)
            {
                param.Add(DialogParameterNames.Filters, filters);
            }
            if (rootFolders != null)
            {
                param.Add(DialogParameterNames.RootFolders, rootFolders);
            }
            if (isModal)
            {
                dialogService.ShowDialog(DialogNames.FileSelectDialog, param, callBack);
            }
            else
            {
                dialogService.Show(DialogNames.FileSelectDialog, param, callBack);
            }
        }
        /// <summary>
        /// Show file save dialog.
        /// </summary>
        /// <param name="dialogService"></param>
        /// <param name="title">Dialog title.</param>
        /// <param name="callBack">Callback action.</param>
        /// <param name="isModal">If true; dialog is shown as a modal.</param>
        /// <param name="fileNamePrefixText">File name prefix text.</param>
        /// <param name="fileTypePrefixText">File type prefix text.</param>
        /// <param name="saveButtonText">Save button text.</param>
        /// <param name="cancelButtonText">Cancel button text.</param>
        /// <param name="textResource">Text resource for explorer.</param>
        /// <param name="filters">File filters.</param>
        /// <param name="rootFolders">Root folders path.</param>
        /// <param name="overwriteConfirmationTitle">Dialog title when overwriting files.</param>
        /// <param name="overwriteConfirmationMessageFunc">Message function when overwriting files.</param>
        /// <param name="overwriteConfirmationOKButtonText">Dialog OK button text when overwriting files.</param>
        /// <param name="overwriteConfirmationCancelButtonText">Dialog Cancel button text when overwriting files.</param>
        public static void ShowFileSaveDialog(this IDialogService dialogService,
                                              string title,
                                              Action <IDialogResult> callBack,
                                              bool isModal = true,
                                              string fileNamePrefixText             = null,
                                              string fileTypePrefixText             = null,
                                              string saveButtonText                 = null,
                                              string cancelButtonText               = null,
                                              ExplorerBaseTextResource textResource = null,
                                              IEnumerable <FileFilter> filters      = null,
                                              IEnumerable <string> rootFolders      = null,
                                              string overwriteConfirmationTitle     = null,
                                              Func <string, string> overwriteConfirmationMessageFunc = null,
                                              string overwriteConfirmationOKButtonText     = null,
                                              string overwriteConfirmationCancelButtonText = null)
        {
            var param = new DialogParameters
            {
                { DialogParameterNames.Title, title }
            };

            if (!string.IsNullOrEmpty(fileNamePrefixText))
            {
                param.Add(DialogParameterNames.FileNamePrefixText, fileNamePrefixText);
            }
            if (!string.IsNullOrEmpty(fileTypePrefixText))
            {
                param.Add(DialogParameterNames.FileTypePrefixText, fileTypePrefixText);
            }
            if (!string.IsNullOrEmpty(saveButtonText))
            {
                param.Add(DialogParameterNames.SaveButtonText, saveButtonText);
            }
            if (!string.IsNullOrEmpty(cancelButtonText))
            {
                param.Add(DialogParameterNames.CancelButtonText, cancelButtonText);
            }
            if (textResource != null)
            {
                param.Add(DialogParameterNames.TextResource, textResource);
            }
            if (filters != null)
            {
                param.Add(DialogParameterNames.Filters, filters);
            }
            if (rootFolders != null)
            {
                param.Add(DialogParameterNames.RootFolders, rootFolders);
            }
            if (!string.IsNullOrEmpty(overwriteConfirmationTitle))
            {
                param.Add(DialogParameterNames.OverwriteConfirmationTitle, overwriteConfirmationTitle);
            }
            if (overwriteConfirmationMessageFunc != null)
            {
                param.Add(DialogParameterNames.OverwriteConfirmationMessageFunc, overwriteConfirmationMessageFunc);
            }
            if (!string.IsNullOrEmpty(overwriteConfirmationOKButtonText))
            {
                param.Add(DialogParameterNames.OverwriteConfirmationOKButtonText, overwriteConfirmationOKButtonText);
            }
            if (!string.IsNullOrEmpty(overwriteConfirmationCancelButtonText))
            {
                param.Add(DialogParameterNames.OverwriteConfirmationCancelButtonText, overwriteConfirmationCancelButtonText);
            }
            if (isModal)
            {
                dialogService.ShowDialog(DialogNames.FileSaveDialog, param, callBack);
            }
            else
            {
                dialogService.Show(DialogNames.FileSaveDialog, param, callBack);
            }
        }
        public MainWindowViewModel(IDialogService dialogService)
        {
            this.dialogService = dialogService;
            this.ShowNotificationDialog.Subscribe(_ =>
            {
                // Standard
                //var param = new DialogParameters
                //{
                //    { DialogParameterNames.Message, "Notification" },
                //    { DialogParameterNames.Title, "Notification" },
                //    { DialogParameterNames.WindowStyle, (System.Windows.Style)App.Current.FindResource("dialogStyle") },
                //};
                //this.dialogService.ShowDialog(DialogNames.Notification, param, res => this.ResultMessage.Value = "Notification");

                // Extensions
                this.dialogService.ShowNotification("Notification", "Notification", res => this.ResultMessage.Value = "Notification");
            });
            this.ShowConfirmationDialog.Subscribe(_ =>
            {
                this.dialogService.ShowConfirmation("Confirmation?", "Confirmation", res =>
                {
                    if (res.Result == ButtonResult.OK)
                    {
                        this.ResultMessage.Value = "Confirmed OK";
                    }
                    else if (res.Result == ButtonResult.Cancel)
                    {
                        this.ResultMessage.Value = "Confirmed Cancel";
                    }
                    else
                    {
                        this.ResultMessage.Value = $"Confirmed {res.Result}";
                    }
                });
            });
            this.ShowSingleFolderSelectDialog.Subscribe(_ =>
            {
                this.dialogService.ShowFolderSelectDialog("SingleFolderSelect", false, res =>
                {
                    if (res.Result == ButtonResult.OK)
                    {
                        var selectedPath         = res.Parameters.GetValue <IEnumerable <string> >(DialogResultParameterNames.SelectedPaths).First();
                        this.ResultMessage.Value = $"Selected Folder: {selectedPath}";
                    }
                    else
                    {
                        this.ResultMessage.Value = "Cancel Single Folder Select";
                    }
                });
            });
            this.ShowMultiFolderSelectDialog.Subscribe(_ =>
            {
                this.dialogService.ShowFolderSelectDialog("MultiFolderSelect", true, res =>
                {
                    if (res.Result == ButtonResult.OK)
                    {
                        var selectedPaths        = res.Parameters.GetValue <IEnumerable <string> >(DialogResultParameterNames.SelectedPaths);
                        this.ResultMessage.Value = $"Selected Folders:{Environment.NewLine}    {string.Join($"{Environment.NewLine}    ", selectedPaths)}";
                    }
                    else
                    {
                        this.ResultMessage.Value = "Cancel Multi Folder Select";
                    }
                });
            });
            this.ShowSingleFileSelectDialog.Subscribe(_ =>
            {
                this.dialogService.ShowFileSelectDialog("SingleFileSelect", false, res =>
                {
                    if (res.Result == ButtonResult.OK)
                    {
                        var selectedPaths = res.Parameters.GetValue <IEnumerable <string> >(DialogResultParameterNames.SelectedPaths);
                        if (selectedPaths != null && selectedPaths.Any())
                        {
                            this.ResultMessage.Value = $"Selected File: {selectedPaths.First()}";
                        }
                        else
                        {
                            this.ResultMessage.Value = "File Not Selected";
                        }
                    }
                    else
                    {
                        this.ResultMessage.Value = "Cancel Single File Select";
                    }
                });
            });
            this.ShowMultiFileSelectDialog.Subscribe(_ =>
            {
                var filters = new[]
                {
                    new FileFilter("All Files (*.*)"),
                    new FileFilter("Text File (*.txt; *.csv)", new[] { ".txt", ".csv" }),
                    new FileFilter("Excel File (*.xlsx; *.xlsm; *.xls)", ".xlsx", ".xlsm", ".xls"),
                };
                this.dialogService.ShowFileSelectDialog("MultiFileSelect", true, res =>
                {
                    if (res.Result == ButtonResult.OK)
                    {
                        var selectedPaths = res.Parameters.GetValue <IEnumerable <string> >(DialogResultParameterNames.SelectedPaths);
                        if (selectedPaths != null && selectedPaths.Any())
                        {
                            this.ResultMessage.Value = $"Selected Files:{Environment.NewLine}    {string.Join($"{Environment.NewLine}    ", selectedPaths)}";
                        }
                        else
                        {
                            this.ResultMessage.Value = "File Not Selected";
                        }
                    }
                    else
                    {
                        this.ResultMessage.Value = "Cancel Multi File Select";
                    }
                },
                                                        // Add File Filters
                                                        filters: filters);
            });
            this.ShowFileSaveDialog.Subscribe(_ =>
            {
                this.dialogService.ShowFileSaveDialog("FileSave", res =>
                {
                    if (res.Result == ButtonResult.OK)
                    {
                        var saveFilePath         = res.Parameters.GetValue <string>(DialogResultParameterNames.SaveFilePath);
                        this.ResultMessage.Value = $"Save File Path: {saveFilePath}";
                    }
                    else
                    {
                        this.ResultMessage.Value = "Cancel File Save";
                    }
                });
            });
            this.ShowCustomizedFileSaveDialog.Subscribe(_ =>
            {
                var textResource = new ExplorerBaseTextResource()
                {
                    FileName         = "Name",
                    FileDateModified = "Date modified",
                    FileType         = "Type",
                    FileSize         = "Size",
                };
                var filters = new[]
                {
                    new FileFilter("All Files (*.*)"),
                    new FileFilter("Text File (*.txt)", ".txt"),
                    new FileFilter("CSV File (*.csv)", ".csv"),
                };
                var icons = new ExplorerIcons()
                {
                    BackWardIcon = new BitmapImage(new Uri("/Resources/Backwards_16x.png", UriKind.Relative)),
                    ForwardIcon  = new BitmapImage(new Uri("/Resources/Forwards_16x.png", UriKind.Relative)),
                };
                Func <string, string> overwriteConfirmationMessageFunc = (x => $"{x} already exists.{Environment.NewLine}Do you want to replace it?");
                var param = new DialogParameters
                {
                    { DialogParameterNames.Title, "FileSave" },
                    { DialogParameterNames.DefaultSaveFileName, "Sample.txt" },
                    { DialogParameterNames.FileNamePrefixText, "File name:" },
                    { DialogParameterNames.FileTypePrefixText, "Save as type:" },
                    { DialogParameterNames.SaveButtonText, "Save" },
                    { DialogParameterNames.CancelButtonText, "Cancel" },
                    { DialogParameterNames.TextResource, textResource },
                    { DialogParameterNames.Filters, filters },
                    { DialogParameterNames.ExplorerIcons, icons },
                    { DialogParameterNames.OverwriteConfirmationTitle, "OverWrite Confirmation" },
                    { DialogParameterNames.OverwriteConfirmationMessageFunc, overwriteConfirmationMessageFunc },
                    { DialogParameterNames.OverwriteConfirmationOKButtonText, "Yes" },
                    { DialogParameterNames.OverwriteConfirmationCancelButtonText, "No" },
                    //{ DialogParameterNames.RootFolders, new [] { @"C:\" } },
                };
                this.dialogService.ShowDialog(DialogNames.FileSaveDialog, param, res =>
                {
                    if (res.Result == ButtonResult.OK)
                    {
                        var saveFilePath         = res.Parameters.GetValue <string>(DialogResultParameterNames.SaveFilePath);
                        this.ResultMessage.Value = $"Save File Path: {saveFilePath}";
                    }
                    else
                    {
                        this.ResultMessage.Value = "Cancel File Save";
                    }
                });
            });
        }