private void GridPreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            try
            {
                if (!IsDragging)
                {
                    return;
                }

                //get the target item
                if (grid.SelectedItem != null)
                {
                    var targetItem = ((DataRowView)grid.SelectedItem).Row;

                    if (targetItem != null && !ReferenceEquals(DraggedItem, targetItem))
                    {
                        Loading = true;
                        var row = ColumnChooserDataTable.NewRow();
                        row[0] = DraggedItem[0];
                        row[1] = DraggedItem[1];
                        row[2] = DraggedItem[2];
                        var rowToBemoved =
                            ColumnChooserDataTable.AsEnumerable().First(
                                r => Convert.ToString(r["columnField"]) == Convert.ToString(DraggedItem["columnField"]));
                        ColumnChooserDataTable.Rows.Remove(rowToBemoved);
                        var currentTargetRow = ColumnChooserDataTable.AsEnumerable().First(
                            r => Convert.ToString(r["columnField"]) == Convert.ToString(targetItem["columnField"]));
                        int targetIndex = ColumnChooserDataTable.Rows.IndexOf(currentTargetRow);
                        if (targetIndex == 0)
                        {
                            targetIndex++;
                        }

                        ColumnChooserDataTable.Rows.InsertAt(row, targetIndex);
                        var previousColumnFieldName =
                            Convert.ToString(ColumnChooserDataTable.Rows[targetIndex - 1]["columnField"]);


                        var columnCollection = MainGrid.Columns;
                        var columns          = columnCollection.ToList();
                        columns.Sort(CompareColumnPosition);
                        var pos = 0;
                        columns.ForEach(c =>
                        {
                            c.DisplayIndex = pos;
                            pos++;
                        });
                        var previousVisiblePosition = previousColumnFieldName == "(Select All)"
                                                          ? 0
                                                          : MainGrid.Columns[
                            GetColumnIndex(MainGrid.Columns, previousColumnFieldName)
                                                      ].DisplayIndex;
                        var currentFiledName = Convert.ToString(ColumnChooserDataTable.Rows[targetIndex]["columnField"]);

                        MainGrid.Columns[GetColumnIndex(MainGrid.Columns, currentFiledName)].DisplayIndex =
                            previousVisiblePosition + 1;

                        columns.Clear();
                        columns.AddRange(columnCollection);
                        if (previousColumnFieldName == "(Select All)")
                        {
                            columns.ForEach(c =>
                            {
                                if (c.SortMemberPath != currentFiledName)
                                {
                                    if (c.DisplayIndex + 1 < columns.Count)
                                    {
                                        c.DisplayIndex = c.DisplayIndex + 1;
                                    }
                                    else
                                    {
                                        c.DisplayIndex = columns.Count - 1;
                                    }
                                }
                            });
                        }
                        else
                        {
                            columns.ForEach(c =>
                            {
                                if (c.SortMemberPath != currentFiledName &&
                                    c.SortMemberPath != previousColumnFieldName)
                                {
                                    if (c.DisplayIndex + 1 < columns.Count)
                                    {
                                        c.DisplayIndex = c.DisplayIndex + 1;
                                    }
                                    else
                                    {
                                        c.DisplayIndex = columns.Count - 1;
                                    }
                                }
                            });
                        }

                        grid.SelectedItem = DraggedItem;
                        //Reorder row summaries after reordering column using column chosser.
                        foreach (var mainGridColumn in MainGrid.Columns)
                        {
                            var rowSummariesColumn = MainGrid.RowSummariesGrid.Columns.FirstOrDefault(column => column.SortMemberPath == mainGridColumn.SortMemberPath);
                            if (rowSummariesColumn != null)
                            {
                                rowSummariesColumn.DisplayIndex = mainGridColumn.DisplayIndex;
                            }
                        }

                        Loading = false;
                    }
                    ResetDragDrop();
                }
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex.Message);
            }
        }
        private void CheckBoxChecked(object sender, RoutedEventArgs e)
        {
            try
            {
                if (Loading)
                {
                    return;
                }
                var chkBox = sender as CheckBox;

                if (chkBox != null)
                {
                    if (!chkBox.IsFocused)
                    {
                        return;
                    }

                    var cell = FindParent <DataGridCell>(chkBox);

                    var rowOwner  = FindParent <DataGridRow>(cell);
                    var filedName = Convert.ToString(((DataRowView)(rowOwner.Item)).Row.ItemArray[2]);
                    if (string.IsNullOrEmpty(filedName))
                    {
                        return;
                    }
                    var contextMenu =
                        FindParent <ContextMenu>(
                            grid);

                    var mainGrid = MainGrid;


                    if (
                        !contextMenu
                        .IsOpen)
                    {
                        return;
                    }

                    if (filedName == "(Select All)")
                    {
                        foreach (var col in mainGrid.Columns)
                        {
                            col.Visibility = chkBox.IsChecked != null && chkBox.IsChecked.Value ? Visibility.Visible : Visibility.Collapsed;
                        }
                        Loading = true;
                        foreach (DataRow dataRow in ColumnChooserDataTable.Rows)
                        {
                            if (Convert.ToString(dataRow["columnField"]) != "(Select All)")
                            {
                                dataRow["chkBox"] = chkBox.IsChecked != null && chkBox.IsChecked.Value;
                            }
                        }
                        if (chkBox.IsChecked != null && chkBox.IsChecked.Value)
                        {
                            var count = mainGrid.Columns.Count(c => ConvertVisibiltyToBool(c.Visibility));
                            _checkedCount = count;
                        }
                        else
                        {
                            _checkedCount = 0;
                        }
                        Loading = false;
                    }
                    else
                    {
                        var parentCell     = FindParent <DataGridCell>(chkBox);
                        var rowparentOwner = FindParent <DataGridRow>(parentCell);
                        ColumnChooserDataTable.AsEnumerable().First(
                            r =>
                            Convert.ToString(r["columnField"]) ==
                            Convert.ToString(((DataRowView)(rowparentOwner.Item)).Row.ItemArray[2]))["chkBox"] =
                            chkBox.IsChecked != null && chkBox.IsChecked.Value;
                        if (chkBox.IsChecked != null && chkBox.IsChecked.Value)
                        {
                            _checkedCount++;
                        }
                        else
                        {
                            _checkedCount--;
                        }


                        mainGrid.Columns[GetColumnIndex(mainGrid.Columns, filedName)].Visibility =
                            chkBox.IsChecked != null && chkBox.IsChecked.Value ? Visibility.Visible : Visibility.Collapsed;
                        Loading = true;
                        var count = mainGrid.Columns.Count;

                        if (_checkedCount > count)
                        {
                            _checkedCount = count;
                        }


                        ColumnChooserDataTable.AsEnumerable().First(r => r["columnField"].ToString() == "(Select All)")[
                            "chkBox"] = _checkedCount == count;
                        Loading       = false;
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }