private void View(SwagDataRowResult rowResult)
        {
            SwagDataColumn swagDataColumn = (SwagDataColumn)rowResult.Parent.SwagData;
            SwagDataRow    swagDataRow    = (SwagDataRow)rowResult.SwagData;
            DataRowView    drv            = drv = swagDataColumn.SwagDataTable.DataTable.DefaultView[swagDataColumn.SwagDataTable.DataTable.Rows.IndexOf(swagDataRow.DataRow)];;
            SwagDataTable  swagDataTable  = swagDataColumn.SwagDataTable;
            DataGridColumn dataGridColumn = DataGrid.Columns.FirstOrDefault(c => c.Header.ToString() == swagDataColumn.ColumnName);

            swagDataTable = swagDataColumn.SwagDataTable;

            Dispatcher.BeginInvoke(DispatcherPriority.Render, new Action(() =>
            {
                DataGridCellInfo cellInfo = new DataGridCellInfo(drv, dataGridColumn);
                DataGrid.ScrollIntoView(cellInfo.Item, cellInfo.Column);
                DataGrid.SelectedCells.Clear();
                DataGrid.SelectedCells.Add(cellInfo);
                DataGrid.CurrentCell = cellInfo;
                DataGrid.Focus();
            }));
        }
        public static void InitSwagDataTable(SwagDataTable swagDataTable)
        {
            if (swagDataTable.DataTable == null) //Build DataTable
            {
                DataTable dt = new DataTable(swagDataTable.Display);
                foreach (KeyValuePair <String, SwagDataColumn> kvpCol in swagDataTable.Columns)
                {
                    kvpCol.Value.SwagDataTable = swagDataTable;
                    dt.Columns.Add(kvpCol.Value.DataColumn());
                }

                swagDataTable.DictRows.Clear();
                foreach (SwagData swagData in swagDataTable.Children)
                {
                    if (swagData is SwagDataRow swagDataRow)
                    {
                        DataRow dr = dt.NewRow();
                        foreach (KeyValuePair <String, JToken> kvpField in swagDataRow.Value)
                        {
                            dr[kvpField.Key] = ((JValue)kvpField.Value).Value;
                        }
                        swagDataTable.DictRows.Add(dr, swagDataRow);
                        dt.Rows.Add(dr);
                        swagDataRow.DataRow = dr;
                    }
                }

                swagDataTable.DataTable = dt;
                swagDataTable.InitColumns();
            }
            else //Build From DataTable
            {
                #region Clear Columns and Rows for instance
                swagDataTable.Columns.Clear();
                swagDataTable.Children.Clear();
                #endregion Clear Columns and Rows for instance

                #region Add Columns and Rows for instance
                swagDataTable.InitColumns();
                foreach (DataColumn dc in swagDataTable.DataTable.Columns)
                {
                    SwagDataColumn sdc = new SwagDataColumn()
                    {
                        ColumnName = dc.ColumnName, DataType = dc.DataType
                    };
                    sdc.SwagDataTable  = swagDataTable;
                    sdc.DataTypeString = sdc.DataTypeString;
                    swagDataTable.Children.Add(sdc);
                    swagDataTable.Columns.Add(dc.ColumnName, sdc);
                }

                swagDataTable.DictRows.Clear();
                foreach (DataRow dr in swagDataTable.DataTable.Rows)
                {
                    SwagDataRow row = new SwagDataRow(dr);
                    row.Value           = row.Value;
                    row.ValueTypeString = row.ValueTypeString;
                    swagDataTable.Children.Add(row);
                    swagDataTable.DictRows.Add(row.DataRow, row);
                }
                #endregion Add Columns and Rows for instance
            }

            #region InitViews
            CollectionViewSource columnsVisibilitySource, columnsFilterSource;
            columnsVisibilitySource = new CollectionViewSource()
            {
                Source = swagDataTable.Columns
            };
            columnsFilterSource = new CollectionViewSource()
            {
                Source = swagDataTable.Columns
            };
            columnsFilterSource.View.Filter = (itm) =>
            {
                KeyValuePair <String, SwagDataColumn> kvp = (KeyValuePair <String, SwagDataColumn>)itm;
                return(kvp.Value.HasAppliedFilter);
            };
            swagDataTable.ColumnsVisibilityView = columnsVisibilitySource.View;
            swagDataTable.ColumnsFilterView     = columnsFilterSource.View;
            #endregion InitViews

            #region FilterCommand
            swagDataTable.FilterCommand = new RelayCommand(() =>
            {
                ICollectionView view = CollectionViewSource.GetDefaultView(swagDataTable.DataTable.DefaultView);
                if (view is BindingListCollectionView)      //Assuming you are DataView for now
                {
                    BindingListCollectionView bindingView = (BindingListCollectionView)view;
                    //https://stackoverflow.com/questions/9385489/why-errors-when-filters-datatable-with-collectionview
                    bindingView.CancelEdit();

                    String combinedFilter = "";
                    foreach (KeyValuePair <string, SwagDataColumn> kvp in swagDataTable.Columns)
                    {
                        if (kvp.Value.HasAppliedFilter)
                        {
                            String filterTemp = kvp.Value.AppliedFilter;
                            if (kvp.Value.AppliedFilter.Contains("'(Blanks)'"))
                            {
                                filterTemp = string.Format("({0} OR CONVERT([{1}], 'System.String') = '' OR [{1}] IS NULL)", kvp.Value.AppliedFilter, kvp.Key);
                            }
                            combinedFilter = string.Format("{0}{1} AND ", combinedFilter, filterTemp);
                        }
                    }

                    if (combinedFilter.EndsWith("AND "))
                    {
                        combinedFilter = combinedFilter.Substring(0, combinedFilter.Length - 4);
                    }

                    bindingView.CustomFilter = combinedFilter;
                }

                columnsFilterSource.View.Refresh();
            });
            #endregion FilterCommand

            #region ExportCommand
            swagDataTable.ExportCommand = new RelayCommand(() =>
            {
                IDataTableConverter converter  = null;
                string dialogFilter            = "";
                SwagTableExportType exportType = swagDataTable.Settings["Export"]["Type"].GetValue <SwagTableExportType>();
                switch (exportType)
                {
                case SwagTableExportType.Csv:
                    converter    = new DataTableCsvStringConverter();
                    dialogFilter = "CSV files (*.csv)|*.csv";
                    break;

                case SwagTableExportType.TSql_Command:
                    converter    = new DataTableTSqlCommandConverter();
                    dialogFilter = "SQL files (*.sql)|*.sql";
                    break;

                case SwagTableExportType.Sqlite:
                    SaveFileDialog sfd   = new SaveFileDialog();
                    sfd.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
                    sfd.FileName         = Path.ChangeExtension(swagDataTable.DataTable.TableName, null);
                    sfd.Filter           = "SQLite files (*.db;*.sqlite)|*.db;*.sqlite";
                    System.Windows.Application.Current.Dispatcher.Invoke(new Action(() =>
                    {
                        if (sfd.ShowDialog() ?? false)
                        {
                            DataSetSqliteFileConverter dsConverter = new DataSetSqliteFileConverter();
                            DataSet ds = new DataSet();
                            ds.Tables.Add(swagDataTable.DataTable.Copy());
                            dsConverter.FromDataSet(null, ds, sfd.FileName);
                        }
                    }));
                    return;

                case SwagTableExportType.Sqlite_Command:
                    converter    = new DataTableSqliteCommandConverter();
                    dialogFilter = "SQLite command files (*.cmd)|*.cmd";
                    break;
                }

                Object output = converter.FromDataTableToObject(new DataTableConvertParams(), swagDataTable.DataTable.DefaultView.ToTable());

                switch (swagDataTable.Settings["Export"]["Destination"].GetValue <SwagTableDestinationType>())
                {
                case SwagTableDestinationType.Clipboard:
                    Clipboard.SetText(output.ToString());
                    break;

                case SwagTableDestinationType.File:
                    SaveFileDialog sfd   = new SaveFileDialog();
                    sfd.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
                    sfd.FileName         = swagDataTable.DataTable.TableName;
                    sfd.Filter           = dialogFilter;

                    System.Windows.Application.Current.Dispatcher.Invoke(new Action(() =>
                    {
                        if (sfd.ShowDialog() ?? false)
                        {
                            File.WriteAllText(sfd.FileName, output.ToString());
                        }
                    }));
                    break;

                case SwagTableDestinationType.New_Window:
                    Window window         = new Window();
                    TextBox textBox       = new TextBox();
                    textBox.AcceptsReturn = textBox.AcceptsTab = true;
                    textBox.Text          = output.ToString();
                    window.Content        = textBox;
                    window.Show();
                    break;
                }
            });
            #endregion ExportCommand

            #region ImportCommand
            swagDataTable.ImportCommand = new RelayCommand(() =>
            {
                IDataTableConverter converter = null;
                DataTableConvertParams cp     = new DataTableConvertParams();

                string dialogFilter = "";
                String inputText    = "";

                switch (swagDataTable.Settings["Import"]["Type"].GetValue <SwagTableImportType>())
                {
                case SwagTableImportType.Csv:
                    converter    = new DataTableCsvStringConverter();
                    dialogFilter = "CSV files (*.csv)|*.csv";
                    break;

                case SwagTableImportType.Tsv:
                    converter     = new DataTableCsvStringConverter();
                    cp.FieldDelim = '\t';
                    dialogFilter  = "TSV files (*.tsv)|*.tsv";
                    break;
                }

                switch (swagDataTable.Settings["Import"]["Source"].GetValue <SwagTableSourceType>())
                {
                case SwagTableSourceType.File:
                    OpenFileDialog ofd   = new OpenFileDialog();
                    ofd.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
                    ofd.Filter           = dialogFilter;

                    System.Windows.Application.Current.Dispatcher.Invoke(new Action(() =>
                    {
                        if (ofd.ShowDialog() ?? false)
                        {
                            inputText = File.ReadAllText(ofd.FileName);
                        }
                        else
                        {
                            return;
                        }
                    }));
                    break;

                case SwagTableSourceType.Clipboard:
                    inputText = Clipboard.GetText();
                    break;
                }

                DataTable dtInput       = converter.ToDataTable(cp, inputText);
                swagDataTable.DataTable = dtInput;
            });
            #endregion ImportCommand

            #region ApplyColumnVisibilityFilterCommand
            swagDataTable.ApplyColumnVisibilityFilterCommand =
                new RelayCommand(() =>
            {
                columnsVisibilitySource.View.Filter = (itm) =>
                {
                    KeyValuePair <String, SwagDataColumn> kvp = (KeyValuePair <String, SwagDataColumn>)itm;
                    return(SearchHelper.Evaluate(
                               kvp.Key,
                               swagDataTable.Settings["ColumnEditor"]["Visibility"]["Search"]["Text"].GetValue <string>(),
                               false,
                               swagDataTable.Settings["ColumnEditor"]["Visibility"]["Search"]["FilterMode"].GetValue <FilterMode>(),
                               false));
                };
            });
            #endregion ApplyColumnVisibilityFilterCommand

            #region ApplyColumnFiltersFilterCommand
            swagDataTable.ApplyColumnFiltersFilterCommand =
                new RelayCommand(() =>
            {
                columnsFilterSource.View.Filter = (itm) =>
                {
                    KeyValuePair <String, SwagDataColumn> kvp = (KeyValuePair <String, SwagDataColumn>)itm;
                    return(kvp.Value.HasAppliedFilter && (SearchHelper.Evaluate(
                                                              kvp.Key,
                                                              swagDataTable.Settings["ColumnEditor"]["Filters"]["Search"]["Text"].GetValue <string>(),
                                                              false,
                                                              swagDataTable.Settings["ColumnEditor"]["Filters"]["Search"]["FilterMode"].GetValue <FilterMode>(),
                                                              false) || SearchHelper.Evaluate(
                                                              kvp.Value.AppliedFilter,
                                                              swagDataTable.Settings["ColumnEditor"]["Filters"]["Search"]["Text"].GetValue <string>(),
                                                              false,
                                                              swagDataTable.Settings["ColumnEditor"]["Filters"]["Search"]["FilterMode"].GetValue <FilterMode>(),
                                                              false)));
                };
            });
            #endregion ApplyColumnFiltersFilterCommand

            #region ResetColumnsCommand
            swagDataTable.ResetColumnsCommand =
                new RelayCommand(() =>
            {
                swagDataTable.DelaySave        = true;
                columnsVisibilitySource.Source = columnsFilterSource.Source = swagDataTable.Columns;
                columnsVisibilitySource.View.Refresh();
                columnsFilterSource.View.Refresh();
                swagDataTable.OnPropertyChangedPublic("ColumnsView");
                swagDataTable.OnPropertyChangedPublic("ColumnCount");
                swagDataTable.DelaySave = false;
                var tempCols            = swagDataTable.Columns;
                swagDataTable.Columns   = null;
                swagDataTable.Columns   = tempCols;
            });
            #endregion ResetColumnsCommand

            #region InitSettings
            swagDataTable.Settings.TryAddChildSetting("ColumnEditor", new SwagSettingGroup()
            {
                Icon = PackIconMaterialKind.TableColumn, Icon2 = PackIconFontAwesomeKind.EditSolid
            });
            swagDataTable.Settings["ColumnEditor"].TryAddChildSetting("Visibility", new SwagSettingGroup()
            {
                Icon = PackIconMaterialKind.TableColumn, Icon2 = PackIconMaterialKind.Eye
            });
            swagDataTable.Settings["ColumnEditor"]["Visibility"].TryAddChildSetting("Search", new SwagSettingGroup()
            {
                Icon = PackIconMaterialKind.Magnify
            });
            swagDataTable.Settings["ColumnEditor"]["Visibility"]["Search"].TryAddChildSetting("Text", new SwagSetting <String>()
            {
                Icon = PackIconBoxIconsKind.RegularText
            });
            swagDataTable.Settings["ColumnEditor"]["Visibility"]["Search"].TryAddChildSetting("FilterMode", new SwagSetting <FilterMode>()
            {
                SettingType = SettingType.DropDown, Value = FilterMode.CONTAINS, Icon = PackIconUniconsKind.Filter, ItemsSource = (FilterMode[])Enum.GetValues(typeof(FilterMode))
            });
            swagDataTable.Settings["ColumnEditor"].TryAddChildSetting("Filters", new SwagSettingGroup()
            {
                Icon = PackIconMaterialKind.TableColumn, Icon2 = PackIconMaterialKind.Filter
            });
            swagDataTable.Settings["ColumnEditor"]["Filters"].TryAddChildSetting("Search", new SwagSettingGroup()
            {
                Icon = PackIconMaterialKind.Magnify
            });
            swagDataTable.Settings["ColumnEditor"]["Filters"]["Search"].TryAddChildSetting("Text", new SwagSetting <String>()
            {
                Icon = PackIconBoxIconsKind.RegularText
            });
            swagDataTable.Settings["ColumnEditor"]["Filters"]["Search"].TryAddChildSetting("FilterMode", new SwagSetting <FilterMode>()
            {
                SettingType = SettingType.DropDown, Value = FilterMode.CONTAINS, Icon = PackIconUniconsKind.Filter, ItemsSource = (FilterMode[])Enum.GetValues(typeof(FilterMode))
            });
            swagDataTable.Settings.TryAddChildSetting("Search", new SwagSettingGroup()
            {
                Icon = PackIconMaterialKind.Table, Icon2 = PackIconMaterialKind.Magnify
            });
            swagDataTable.Settings["Search"].TryAddChildSetting("Text", new SwagSetting <String>()
            {
                Icon = PackIconBoxIconsKind.RegularText
            });
            swagDataTable.Settings["Search"].TryAddChildSetting("FilterMode", new SwagSetting <FilterMode>()
            {
                SettingType = SettingType.DropDown, Value = FilterMode.CONTAINS, Icon = PackIconUniconsKind.Filter, ItemsSource = (FilterMode[])Enum.GetValues(typeof(FilterMode))
            });
            swagDataTable.Settings.TryAddChildSetting("Export", new SwagSettingGroup()
            {
                Icon = PackIconMaterialKind.Export
            });
            swagDataTable.Settings["Export"].TryAddChildSetting("Type", new SwagSetting <SwagTableExportType>()
            {
                SettingType = SettingType.DropDown, Value = SwagTableExportType.Csv, Icon = PackIconMaterialKind.Export, Icon2 = PackIconFontAwesomeKind.ShapesSolid, ItemsSource = (SwagTableExportType[])Enum.GetValues(typeof(SwagTableExportType))
            });
            swagDataTable.Settings["Export"].TryAddChildSetting("Destination", new SwagSetting <SwagTableDestinationType>()
            {
                SettingType = SettingType.DropDown, Value = SwagTableDestinationType.Clipboard, Icon = PackIconMaterialKind.Target, ItemsSource = (SwagTableDestinationType[])Enum.GetValues(typeof(SwagTableDestinationType))
            });
            swagDataTable.Settings.TryAddChildSetting("Import", new SwagSettingGroup()
            {
                Icon = PackIconMaterialKind.Import
            });
            swagDataTable.Settings["Import"].TryAddChildSetting("Type", new SwagSetting <SwagTableImportType>()
            {
                SettingType = SettingType.DropDown, Value = SwagTableImportType.Tsv, Icon = PackIconMaterialKind.Import, Icon2 = PackIconFontAwesomeKind.ShapesSolid, ItemsSource = (SwagTableImportType[])Enum.GetValues(typeof(SwagTableImportType))
            });
            swagDataTable.Settings["Import"].TryAddChildSetting("Source", new SwagSetting <SwagTableSourceType>()
            {
                SettingType = SettingType.DropDown, Value = SwagTableSourceType.Clipboard, Icon = PackIconMaterialKind.SourceCommitStart, ItemsSource = (SwagTableSourceType[])Enum.GetValues(typeof(SwagTableSourceType))
            });
            #endregion InitSettings

            #region InitTabs
            SwagTabGroup tabs = new SwagTabGroup();
            tabs["ColumnEditor"] = new SwagTabGroup()
            {
                Icon = PackIconMaterialKind.TableColumn, Icon2 = PackIconFontAwesomeKind.EditSolid, Display = "Column Editor"
            };
            tabs["Search"] = new SwagTabItem()
            {
                Icon = PackIconMaterialKind.TextSearch
            };
            tabs["Export"] = new SwagTabItem()
            {
                Icon = PackIconMaterialKind.Table, Icon2 = PackIconMaterialKind.ArrowRightThick
            };
            tabs["Import"] = new SwagTabItem()
            {
                Icon = PackIconMaterialKind.Table, Icon2 = PackIconMaterialKind.ArrowLeftThick
            };
            tabs["Settings"] = new SwagTabItem()
            {
                Icon = PackIconMaterialKind.Cog
            };
            tabs["ColumnEditor"]["Visibility"] = new SwagTabItem()
            {
                Icon = PackIconMaterialKind.TableColumn, Icon2 = PackIconMaterialKind.Eye
            };
            tabs["ColumnEditor"]["Filters"] = new SwagTabItem()
            {
                Icon = PackIconMaterialKind.TableColumn, Icon2 = PackIconMaterialKind.Filter
            };
            //tabs["ColumnEditor"]["Add"] = new SwagTabItem() { Icon = PackIconMaterialKind.TableColumn, Icon2 = PackIconMaterialKind.Plus };
            //tabs["ColumnEditor"]["View"] = new SwagTabItem() { Icon = PackIconMaterialKind.TableColumn, Icon2 = PackIconMaterialKind.Magnify };
            swagDataTable.Tabs = tabs;
            SwagItemPreOrderIterator <SwagTabItem> iterator = tabs.CreateIterator();
            for (SwagTabItem tabItem = iterator.First(); !iterator.IsDone; tabItem = iterator.Next())
            {
                tabItem.ViewModel = swagDataTable;
            }
            //swagDataTable.Tabs.SwagItemChanged += _tabs_SwagItemChanged;
            //swagDataTable.Tabs.PropertyChangedExtended += _tabs_PropertyChangedExtended;
            #endregion InitTabs

            swagDataTable.PropertyChanged += SwagDataTable_PropertyChanged;
            swagDataTable.InitDataTable();
            swagDataTable.IsInitialized = true;
        }