private void init(FilePickerMode mode = FilePickerMode.Open, string filterStr = "All files (*)|*")
        {
            FilterStr        = filterStr;
            WindowTitleMask  = Enum.GetName(typeof(FilePickerMode), mode);
            _mode            = mode;
            _tryCloseCommand = new SimpleScriptCommand("TryClose", pd => { TryClose(true); return(ResultCommand.NoError); });

            FileList.Commands.CommandDictionary.Open = FileExplorer.Script.FileList.IfSelection(evm => evm.Count() == 1,
                                                                                                FileExplorer.Script.FileList.IfSelection(evm => evm[0].EntryModel.IsDirectory,
                                                                                                                                         OpenSelectedDirectory.FromFileList, //Selected directory
                                                                                                                                         new SimpleScriptCommand("", (pd) =>
            {
                switch (mode)
                {
                case FilePickerMode.Open: Open(); break;

                case FilePickerMode.Save: Save(); break;
                }

                return(ResultCommand.NoError);
            })),                                                                                                      //Selected non-directory
                                                                                                ResultCommand.NoError //Selected more than one item.
                                                                                                );

            FileList.Selection.SelectionChanged += (o1, e1) =>
            {
                var firstDir =
                    FileList.Selection.SelectedItems.FirstOrDefault(evm => evm.EntryModel.IsDirectory);
                if (firstDir != null)
                {
                    //setFileName(firstDir.EntryModel.Label, false);
                }
                else
                {
                    string newFileName = String.Join(",",
                                                     FileList.Selection.SelectedItems.Where(evm => !evm.EntryModel.IsDirectory)
                                                     .Select(evm => evm.EntryModel.GetName()));

                    if (!String.IsNullOrEmpty(newFileName))
                    {
                        switch (mode)
                        {
                        case FilePickerMode.Save: setFileName(newFileName,
                                                              !newFileName.Contains(',')); break;

                        default: setFileName(newFileName); break;
                        }
                    }
                }
            };

            FileList.EnableDrag        = false;
            FileList.EnableDrop        = false;
            FileList.EnableMultiSelect = false;
        }
        //public void Save()
        //{
        //    string fullPath = FileList.CurrentDirectory.Profile.Path.Combine(FileList.CurrentDirectory.FullPath, FileName);
        //    var foundItem = FileList.ProcessedEntries.EntriesHelper.AllNonBindable.Select(evm => evm.EntryModel)
        //            .FirstOrDefault(em =>
        //            em.FullPath.Equals(fullPath, StringComparison.CurrentCultureIgnoreCase));
        //    if (foundItem != null)
        //    {
        //        string name = foundItem.Profile.Path.GetFileName(foundItem.FullPath);
        //        new IfOkCancel(_windowManager, () => "Overwrite", String.Format("Overwrite {0}?", name),
        //    }

        //}

        public async Task Save()
        {
            var pm = FileList.Commands.ParameterDicConverter.Convert(new ParameterDic());

            Profile = FileList.CurrentDirectory.Profile;

            //Update FileName in case user does not enter full path name.
            IScriptCommand updateFileName =
                new SimpleScriptCommand("updateFileName", pd =>
            {
                FileName = Profile.Path.Combine(FileList.CurrentDirectory.FullPath, FileName);
                return(ResultCommand.NoError);
            });

            //Update SelectedFiles property (if it's exists.")
            Func <IEntryModel, IScriptCommand> setSelectedFiles =
                m => new SimpleScriptCommand("SetSelectedFiles", pd =>
            {
                SelectedFiles = new[] { m }; FileName = m.FullPath; return(ResultCommand.NoError);
            });

            //Query whether to overwrite and if so, setSelectedFiles, otherwise throw a user cancel exception and no window close.
            Func <IEntryModel, IScriptCommand> queryOverwrite =
                m => new IfOkCancel(_windowManager,
                                    pd => "Overwrite",
                                    pd => "Overwrite " + Profile.Path.GetFileName(FileName),
                                    setSelectedFiles(m), ResultCommand.Error(new Exception("User cancel")) /* Cancel if user press cancel. */);

            await ScriptRunner.RunScriptAsync(pm,
                                              ScriptCommands.RunInSequence(
                                                  Script.FileList.Lookup(
                                                      m => m.FullPath.Equals(FileName) || m.Profile.Path.GetFileName(m.FullPath).Equals(FileName),
                                                      queryOverwrite,
                                                      FileList.CurrentDirectory.Profile.Parse(FileName, queryOverwrite,
                                                                                              updateFileName))),
                                              _tryCloseCommand
                                              );
        }