private void RemoveOpenedItem(int tag, bool ifParent)
        {
            bool search = false;

            if (ifParent)
            {
                foreach (var v in OpenedItems)
                {
                    if (v.Tag == tag)
                    {
                        foreach (var t in v.Items)
                        {
                            RemoveTabEvent?.Invoke(t.Tag);
                            search = true;
                        }
                        OpenedItems.Remove(v);
                        break;
                    }
                }
            }
            else
            {
                foreach (var v in OpenedItems)
                {
                    foreach (var t in v.Items)
                    {
                        if (t.Tag == tag)
                        {
                            RemoveTabEvent?.Invoke(t.Tag);
                            v.Items.Remove(t);
                            search = true;
                            break;
                        }
                    }
                    if (v.Items.Count == 0)
                    {
                        OpenedItems.Remove(v);
                        break;
                    }
                    if (search)
                    {
                        break;
                    }
                }
            }
        }
        public FileManagementViewModel()
        {
            _fileHelper = new StdFileHelper();
            FileInfos   = new ObservableCollection <FileInfo>();
            OpenedItems = new ObservableCollection <OpenedFile>();
            _fileHelper.UpdateFileInfo += UpdateFileInfo;
            _fileHelper.AddFileEvent   += AddFileEvent;

            SelectedSummary    = "";
            SelectedOpenedItem = string.Empty;

            SelectedItemChangedCommand = new DelegateCommand <DevExpress.Xpf.Grid.SelectedItemChangedEventArgs> ((e) => {
                if (!(e.NewItem is LoadedInfoBasic))
                {
                    return;
                }
                LoadedInfoBasic s = e.NewItem as LoadedInfoBasic;
                if (!s.FileStatus)
                {
                    return;
                }
                SelectedSummary = _fileHelper.GetBriefSummary(s.FilePath.GetHashCode(), s.Site);
            });

            ChangeDisplayCommand = new DelegateCommand <DevExpress.Xpf.Grid.SelectedItemChangedEventArgs>((e) => {
                if (!(e.NewItem is OpenedInfoBasic))
                {
                    return;
                }
                var s = e.NewItem as OpenedInfoBasic;
                ChangeViewTabEvent?.Invoke(s.Tag);
            });

            DoubleClickCommand = new DelegateCommand <object>((e) => {
                if (!(e is LoadedInfoBasic))
                {
                    return;
                }
                var s = e as LoadedInfoBasic;
                if (!s.FileStatus)
                {
                    return;
                }
                int hash = s.FilePath.GetHashCode();
                int tag  = hash ^ System.DateTime.UtcNow.Ticks.GetHashCode();
                AddOpenedItem(hash, $"[RAW] SITE:{s.Site.ToString()} {s.FileName}", tag);
                var id = _fileHelper.CreateFilterDataHandler(hash, s.Site);
                OpenDetailEvent?.Invoke(_fileHelper.GetFile(hash), id, tag);
            });

            CloseCommand = new DelegateCommand <object>((e) => {
                var s  = e as OpenedInfoBasic;
                bool b = s.GetType().Name == "OpenedFile";
                RemoveOpenedItem(s.Tag, b);
            });
            FileCloseCommand = new DelegateCommand <RoutedEventArgs>((e) => {
                var path = (((FileInfo)((Button)e.Source).DataContext)).FilePath;

                foreach (var v in OpenedItems)
                {
                    if (v.FilePath == path)
                    {
                        foreach (var t in v.Items)
                        {
                            RemoveTabEvent?.Invoke(t.Tag);
                        }
                        OpenedItems.Remove(v);
                        break;
                    }
                }

                RemoveFile(path);

                for (int i = 0; i < FileInfos.Count; i++)
                {
                    if (FileInfos[i].FilePath == path)
                    {
                        FileInfos.RemoveAt(i);
                    }
                }

                GC.Collect();
            });

            CopySummary = new DelegateCommand(() => {
                Clipboard.SetDataObject(SelectedSummary);
            });
        }